Deleted Added
full compact
mss.c (53512) mss.c (53553)
1/*
2 * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
3 * Copyright Luigi Rizzo, 1997,1998
4 * Copyright by Hannu Savolainen 1994, 1995
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
1/*
2 * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
3 * Copyright Luigi Rizzo, 1997,1998
4 * Copyright by Hannu Savolainen 1994, 1995
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/dev/sound/isa/mss.c 53512 1999-11-21 17:15:12Z cg $
28 * $FreeBSD: head/sys/dev/sound/isa/mss.c 53553 1999-11-22 06:07:49Z tanimura $
29 */
30
31#include <dev/sound/pcm/sound.h>
32
33#if NPCM > 0
34
35/* board-specific include files */
36#include <dev/sound/isa/mss.h>
29 */
30
31#include <dev/sound/pcm/sound.h>
32
33#if NPCM > 0
34
35/* board-specific include files */
36#include <dev/sound/isa/mss.h>
37#include <dev/sound/chip.h>
37
38
39#include "gusc.h"
40#if notyet
41#include "midi.h"
42#endif /* notyet */
43
38#define abs(x) (((x) < 0) ? -(x) : (x))
39
40struct mss_info;
41
42struct mss_chinfo {
43 struct mss_info *parent;
44 pcm_channel *channel;
45 snd_dbuf *buffer;

--- 121 unchanged lines hidden (view full) ---

167#define MD_CS4231A 0xA3
168#define MD_CS4232 0xA4
169#define MD_CS4232A 0xA5
170#define MD_CS4236 0xA6
171#define MD_CS4237 0xA7
172#define MD_OPTI931 0xB1
173#define MD_OPTI925 0xB2
174#define MD_GUSPNP 0xB8
44#define abs(x) (((x) < 0) ? -(x) : (x))
45
46struct mss_info;
47
48struct mss_chinfo {
49 struct mss_info *parent;
50 pcm_channel *channel;
51 snd_dbuf *buffer;

--- 121 unchanged lines hidden (view full) ---

173#define MD_CS4231A 0xA3
174#define MD_CS4232 0xA4
175#define MD_CS4232A 0xA5
176#define MD_CS4236 0xA6
177#define MD_CS4237 0xA7
178#define MD_OPTI931 0xB1
179#define MD_OPTI925 0xB2
180#define MD_GUSPNP 0xB8
181#define MD_GUSMAX 0xB9
175#define MD_YM0020 0xC1
176#define MD_VIVO 0xD1
177
178#define DV_F_TRUE_MSS 0x00010000 /* mss _with_ base regs */
179
180#define FULL_DUPLEX(x) ((x)->bd_flags & BD_F_DUPLEX)
181
182static int

--- 53 unchanged lines hidden (view full) ---

236
237static u_char
238opti_rd(struct mss_info *mss, u_char reg)
239{
240 port_wr(mss->conf_base, mss->opti_offset + 0, reg);
241 return port_rd(mss->conf_base, mss->opti_offset + 1);
242}
243
182#define MD_YM0020 0xC1
183#define MD_VIVO 0xD1
184
185#define DV_F_TRUE_MSS 0x00010000 /* mss _with_ base regs */
186
187#define FULL_DUPLEX(x) ((x)->bd_flags & BD_F_DUPLEX)
188
189static int

--- 53 unchanged lines hidden (view full) ---

243
244static u_char
245opti_rd(struct mss_info *mss, u_char reg)
246{
247 port_wr(mss->conf_base, mss->opti_offset + 0, reg);
248 return port_rd(mss->conf_base, mss->opti_offset + 1);
249}
250
244#if NPNP > 0
251#if NPNP > 0 || NGUSC > 0
245static void
246gus_wr(struct mss_info *mss, u_char reg, u_char value)
247{
248 port_wr(mss->conf_base, 3, reg);
249 port_wr(mss->conf_base, 5, value);
250}
251
252static u_char
253gus_rd(struct mss_info *mss, u_char reg)
254{
255 port_wr(mss->conf_base, 3, reg);
256 return port_rd(mss->conf_base, 5);
257}
252static void
253gus_wr(struct mss_info *mss, u_char reg, u_char value)
254{
255 port_wr(mss->conf_base, 3, reg);
256 port_wr(mss->conf_base, 5, value);
257}
258
259static u_char
260gus_rd(struct mss_info *mss, u_char reg)
261{
262 port_wr(mss->conf_base, 3, reg);
263 return port_rd(mss->conf_base, 5);
264}
258#endif
265#endif /* NPNP > 0 || NGUSC > 0 */
259
260static void
261mss_release_resources(struct mss_info *mss, device_t dev)
262{
263 if (mss->irq) {
264 bus_release_resource(dev, SYS_RES_IRQ, mss->irq_rid,
265 mss->irq);
266 mss->irq = 0;

--- 57 unchanged lines hidden (view full) ---

324 isa_dma_acquire(mss->rdma);
325 isa_dmainit(mss->rdma, DSP_BUFFSIZE);
326 mss->bd_flags |= BD_F_DUPLEX;
327 } else mss->rdma = mss->pdma;
328 }
329 return ok;
330}
331
266
267static void
268mss_release_resources(struct mss_info *mss, device_t dev)
269{
270 if (mss->irq) {
271 bus_release_resource(dev, SYS_RES_IRQ, mss->irq_rid,
272 mss->irq);
273 mss->irq = 0;

--- 57 unchanged lines hidden (view full) ---

331 isa_dma_acquire(mss->rdma);
332 isa_dmainit(mss->rdma, DSP_BUFFSIZE);
333 mss->bd_flags |= BD_F_DUPLEX;
334 } else mss->rdma = mss->pdma;
335 }
336 return ok;
337}
338
339#if NGUSC > 0
340/*
341 * XXX This might be better off in the gusc driver.
342 */
343static void
344gusmax_setup(struct mss_info *mss, device_t dev, struct resource *alt)
345{
346 static const unsigned char irq_bits[16] = {
347 0, 0, 0, 3, 0, 2, 0, 4, 0, 1, 0, 5, 6, 0, 0, 7
348 };
349 static const unsigned char dma_bits[8] = {
350 0, 1, 0, 2, 0, 3, 4, 5
351 };
352 device_t parent = device_get_parent(dev);
353 unsigned char irqctl, dmactl;
354 int s;
355
356 s = splhigh();
357
358 port_wr(alt, 0x0f, 0x05);
359 port_wr(alt, 0x00, 0x0c);
360 port_wr(alt, 0x0b, 0x00);
361
362 port_wr(alt, 0x0f, 0x00);
363
364 irqctl = irq_bits[isa_get_irq(parent)];
365#if notyet
366#if NMIDI > 0
367 /* Share the IRQ with the MIDI driver. */
368 irqctl |= 0x40;
369#endif /* NMIDI > 0 */
370#endif /* notyet */
371 dmactl = dma_bits[isa_get_drq(parent)];
372 if (device_get_flags(parent) & DV_F_DUAL_DMA)
373 dmactl |= dma_bits[device_get_flags(parent) & DV_F_DRQ_MASK]
374 << 3;
375
376 /*
377 * Set the DMA and IRQ control latches.
378 */
379 port_wr(alt, 0x00, 0x0c);
380 port_wr(alt, 0x0b, dmactl | 0x80);
381 port_wr(alt, 0x00, 0x4c);
382 port_wr(alt, 0x0b, irqctl);
383
384 port_wr(alt, 0x00, 0x0c);
385 port_wr(alt, 0x0b, dmactl);
386 port_wr(alt, 0x00, 0x4c);
387 port_wr(alt, 0x0b, irqctl);
388
389 port_wr(mss->conf_base, 2, 0);
390 port_wr(alt, 0x00, 0x0c);
391 port_wr(mss->conf_base, 2, 0);
392
393 splx(s);
394}
395#endif /* NGUSC > 0 */
396
332static int
333mss_init(struct mss_info *mss, device_t dev)
334{
335 u_char r6, r9;
336 struct resource *alt;
337 int rid, tmp;
338
339 mss->bd_flags |= BD_F_MCE_BIT;

--- 11 unchanged lines hidden (view full) ---

351 (rman_get_start(mss->conf_base) & ~3) + 2
352 - rman_get_start(mss->conf_base);
353 printf("mss_init: opti_offset=%d\n", mss->opti_offset);
354 opti_wr(mss, 4, 0xd6); /* fifo empty, OPL3, audio enable, SB3.2 */
355 ad_write(mss, 10, 2); /* enable interrupts */
356 opti_wr(mss, 6, 2); /* MCIR6: mss enable, sb disable */
357 opti_wr(mss, 5, 0x28); /* MCIR5: codec in exp. mode,fifo */
358 break;
397static int
398mss_init(struct mss_info *mss, device_t dev)
399{
400 u_char r6, r9;
401 struct resource *alt;
402 int rid, tmp;
403
404 mss->bd_flags |= BD_F_MCE_BIT;

--- 11 unchanged lines hidden (view full) ---

416 (rman_get_start(mss->conf_base) & ~3) + 2
417 - rman_get_start(mss->conf_base);
418 printf("mss_init: opti_offset=%d\n", mss->opti_offset);
419 opti_wr(mss, 4, 0xd6); /* fifo empty, OPL3, audio enable, SB3.2 */
420 ad_write(mss, 10, 2); /* enable interrupts */
421 opti_wr(mss, 6, 2); /* MCIR6: mss enable, sb disable */
422 opti_wr(mss, 5, 0x28); /* MCIR5: codec in exp. mode,fifo */
423 break;
424#endif /* NPNP > 0 */
359
425
426#if NPNP > 0 || NGUSC > 0
360 case MD_GUSPNP:
427 case MD_GUSPNP:
428 case MD_GUSMAX:
361 gus_wr(mss, 0x4c /* _URSTI */, 0);/* Pull reset */
362 DELAY(1000 * 30);
363 /* release reset and enable DAC */
364 gus_wr(mss, 0x4c /* _URSTI */, 3);
365 DELAY(1000 * 30);
366 /* end of reset */
367
368 rid = 0;
369 alt = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
370 0, ~0, 1, RF_ACTIVE);
429 gus_wr(mss, 0x4c /* _URSTI */, 0);/* Pull reset */
430 DELAY(1000 * 30);
431 /* release reset and enable DAC */
432 gus_wr(mss, 0x4c /* _URSTI */, 3);
433 DELAY(1000 * 30);
434 /* end of reset */
435
436 rid = 0;
437 alt = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
438 0, ~0, 1, RF_ACTIVE);
439 if (alt == NULL) {
440 printf("XXX couldn't init GUS PnP/MAX\n");
441 break;
442 }
371 port_wr(alt, 0, 0xC); /* enable int and dma */
443 port_wr(alt, 0, 0xC); /* enable int and dma */
444#if NGUSC > 0
445 if (mss->bd_id == MD_GUSMAX)
446 gusmax_setup(mss, dev, alt);
447#endif
372 bus_release_resource(dev, SYS_RES_IOPORT, rid, alt);
373
374 /*
375 * unmute left & right line. Need to go in mode3, unmute,
376 * and back to mode 2
377 */
378 tmp = ad_read(mss, 0x0c);
379 ad_write(mss, 0x0c, 0x6c); /* special value to enter mode 3 */

--- 4 unchanged lines hidden (view full) ---

384 /* send codec interrupts on irq1 and only use that one */
385 gus_wr(mss, 0x5a, 0x4f);
386
387 /* enable access to hidden regs */
388 tmp = gus_rd(mss, 0x5b /* IVERI */);
389 gus_wr(mss, 0x5b, tmp | 1);
390 BVDDB(printf("GUS: silicon rev %c\n", 'A' + ((tmp & 0xf) >> 4)));
391 break;
448 bus_release_resource(dev, SYS_RES_IOPORT, rid, alt);
449
450 /*
451 * unmute left & right line. Need to go in mode3, unmute,
452 * and back to mode 2
453 */
454 tmp = ad_read(mss, 0x0c);
455 ad_write(mss, 0x0c, 0x6c); /* special value to enter mode 3 */

--- 4 unchanged lines hidden (view full) ---

460 /* send codec interrupts on irq1 and only use that one */
461 gus_wr(mss, 0x5a, 0x4f);
462
463 /* enable access to hidden regs */
464 tmp = gus_rd(mss, 0x5b /* IVERI */);
465 gus_wr(mss, 0x5b, tmp | 1);
466 BVDDB(printf("GUS: silicon rev %c\n", 'A' + ((tmp & 0xf) >> 4)));
467 break;
392#endif
468#endif /* NPNP > 0 || NGUSC > 0 */
469
393 case MD_YM0020:
394 conf_wr(mss, OPL3SAx_DMACONF, 0xa9); /* dma-b rec, dma-a play */
395 r6 = conf_rd(mss, OPL3SAx_DMACONF);
396 r9 = conf_rd(mss, OPL3SAx_MISC); /* version */
397 BVDDB(printf("Yamaha: ver 0x%x DMA config 0x%x\n", r6, r9);)
398 /* yamaha - set volume to max */
399 conf_wr(mss, OPL3SAx_VOLUMEL, 0);
400 conf_wr(mss, OPL3SAx_VOLUMER, 0);

--- 609 unchanged lines hidden (view full) ---

1010 * 1) Wait until the chip becomes ready (reads don't return 0x80).
1011 * 2) Wait until the ACI bit of I11 gets on
1012 * 3) Wait until the ACI bit of I11 gets off
1013 */
1014
1015 n = ad_wait_init(mss, 1000);
1016 if (n & MSS_IDXBUSY) printf("mss: Auto calibration timed out(1).\n");
1017
470 case MD_YM0020:
471 conf_wr(mss, OPL3SAx_DMACONF, 0xa9); /* dma-b rec, dma-a play */
472 r6 = conf_rd(mss, OPL3SAx_DMACONF);
473 r9 = conf_rd(mss, OPL3SAx_MISC); /* version */
474 BVDDB(printf("Yamaha: ver 0x%x DMA config 0x%x\n", r6, r9);)
475 /* yamaha - set volume to max */
476 conf_wr(mss, OPL3SAx_VOLUMEL, 0);
477 conf_wr(mss, OPL3SAx_VOLUMER, 0);

--- 609 unchanged lines hidden (view full) ---

1087 * 1) Wait until the chip becomes ready (reads don't return 0x80).
1088 * 2) Wait until the ACI bit of I11 gets on
1089 * 3) Wait until the ACI bit of I11 gets off
1090 */
1091
1092 n = ad_wait_init(mss, 1000);
1093 if (n & MSS_IDXBUSY) printf("mss: Auto calibration timed out(1).\n");
1094
1018 for (t = 100; t > 0 && (ad_read(mss, 11) & 0x20) == 0; t--) DELAY(100);
1095 /*
1096 * There is no guarantee that we'll ever see ACI go on,
1097 * calibration may finish before we get here.
1098 *
1099 * XXX Are there docs that even state that it might ever be
1100 * visible off before calibration starts using any chip?
1101 */
1102 if (mss->bd_id == MD_GUSMAX) {
1103 /* 10 ms of busy-waiting is not reasonable normal behavior */
1104 for (t = 100; t > 0 && (ad_read(mss, 11) & 0x20) == 0; t--)
1105 ;
1106 if (t > 0 && t != 100)
1107 printf("debug: ACI turned on: t = %d\n", t);
1108 } else {
1109 for (t = 100; t > 0 && (ad_read(mss, 11) & 0x20) == 0; t--) DELAY(100);
1110 }
1019 for (t = 100; t > 0 && ad_read(mss, 11) & 0x20; t--) DELAY(100);
1020}
1021
1022static void
1023ad_unmute(struct mss_info *mss)
1024{
1025 ad_write(mss, 6, ad_read(mss, 6) & ~I6_MUTE);
1026 ad_write(mss, 7, ad_read(mss, 7) & ~I6_MUTE);

--- 258 unchanged lines hidden (view full) ---

1285 case 0x1093143e: /* OPT9310 */
1286 s = "OPTi931";
1287 break;
1288
1289 case 0x5092143e: /* OPT9250 XXX guessing */
1290 s = "OPTi925";
1291 break;
1292
1111 for (t = 100; t > 0 && ad_read(mss, 11) & 0x20; t--) DELAY(100);
1112}
1113
1114static void
1115ad_unmute(struct mss_info *mss)
1116{
1117 ad_write(mss, 6, ad_read(mss, 6) & ~I6_MUTE);
1118 ad_write(mss, 7, ad_read(mss, 7) & ~I6_MUTE);

--- 258 unchanged lines hidden (view full) ---

1377 case 0x1093143e: /* OPT9310 */
1378 s = "OPTi931";
1379 break;
1380
1381 case 0x5092143e: /* OPT9250 XXX guessing */
1382 s = "OPTi925";
1383 break;
1384
1385#if 0
1293 case 0x0000561e:
1294 s = "GusPnP";
1295 break;
1386 case 0x0000561e:
1387 s = "GusPnP";
1388 break;
1389#endif
1296
1297 case 0x01000000:
1298 if (vend_id == 0x0100a90d) s = "CMI8330";
1299 break;
1300 }
1301
1302 if (s) {
1303 device_set_desc(dev, s);

--- 52 unchanged lines hidden (view full) ---

1356 break;
1357
1358 case 0x2500143e: /* opti925 */
1359 mss->io_rid = 1;
1360 mss->conf_rid = 3;
1361 mss->bd_id = MD_OPTI925;
1362 break;
1363
1390
1391 case 0x01000000:
1392 if (vend_id == 0x0100a90d) s = "CMI8330";
1393 break;
1394 }
1395
1396 if (s) {
1397 device_set_desc(dev, s);

--- 52 unchanged lines hidden (view full) ---

1450 break;
1451
1452 case 0x2500143e: /* opti925 */
1453 mss->io_rid = 1;
1454 mss->conf_rid = 3;
1455 mss->bd_id = MD_OPTI925;
1456 break;
1457
1458#if 0
1364 case 0x0100561e: /* guspnp */
1365 mss->bd_flags |= BD_F_MSS_OFFSET;
1366 mss->io_rid = 2;
1367 mss->conf_rid = 1;
1368 mss->drq1_rid = 1;
1369 mss->drq2_rid = 0;
1370 mss->bd_id = MD_GUSPNP;
1371 break;
1459 case 0x0100561e: /* guspnp */
1460 mss->bd_flags |= BD_F_MSS_OFFSET;
1461 mss->io_rid = 2;
1462 mss->conf_rid = 1;
1463 mss->drq1_rid = 1;
1464 mss->drq2_rid = 0;
1465 mss->bd_id = MD_GUSPNP;
1466 break;
1467#endif
1372
1373 default:
1374 mss->bd_flags |= BD_F_MSS_OFFSET;
1375 mss->bd_id = MD_CS4232;
1376 break;
1377 }
1378 return mss_doattach(dev, mss);
1379}

--- 68 unchanged lines hidden (view full) ---

1448 if (mss->pch.buffer->dl && (mc11 & 4)) chn_intr(mss->pch.channel);
1449 opti_wr(mss, 11, ~mc11); /* ack */
1450 if (--loops) goto again;
1451 DEB(printf("xxx too many loops\n");)
1452}
1453
1454#endif /* NPNP > 0 */
1455
1468
1469 default:
1470 mss->bd_flags |= BD_F_MSS_OFFSET;
1471 mss->bd_id = MD_CS4232;
1472 break;
1473 }
1474 return mss_doattach(dev, mss);
1475}

--- 68 unchanged lines hidden (view full) ---

1544 if (mss->pch.buffer->dl && (mc11 & 4)) chn_intr(mss->pch.channel);
1545 opti_wr(mss, 11, ~mc11); /* ack */
1546 if (--loops) goto again;
1547 DEB(printf("xxx too many loops\n");)
1548}
1549
1550#endif /* NPNP > 0 */
1551
1552#if NGUSC > 0
1553
1456static int
1554static int
1555guspcm_probe(device_t dev)
1556{
1557 struct sndcard_func *func;
1558
1559 func = device_get_ivars(dev);
1560 if (func == NULL || func->func != SCF_PCM)
1561 return ENXIO;
1562
1563 device_set_desc(dev, "GUS CS4231");
1564 return 0;
1565}
1566
1567static int
1568guspcm_attach(device_t dev)
1569{
1570 device_t parent = device_get_parent(dev);
1571 struct mss_info *mss;
1572 int base, flags;
1573 unsigned char ctl;
1574
1575 mss = (struct mss_info *)malloc(sizeof *mss, M_DEVBUF, M_NOWAIT);
1576 if (mss == NULL)
1577 return ENOMEM;
1578 bzero(mss, sizeof *mss);
1579
1580 mss->bd_flags = BD_F_MSS_OFFSET;
1581 mss->io_rid = 2;
1582 mss->conf_rid = 1;
1583 mss->irq_rid = 0;
1584 mss->drq1_rid = 1;
1585 mss->drq2_rid = -1;
1586
1587 if (isa_get_vendorid(parent) == 0)
1588 mss->bd_id = MD_GUSMAX;
1589 else {
1590 mss->bd_id = MD_GUSPNP;
1591 mss->drq2_rid = 0;
1592 goto skip_setup;
1593 }
1594
1595 flags = device_get_flags(parent);
1596 if (flags & DV_F_DUAL_DMA)
1597 mss->drq2_rid = 0;
1598
1599 mss->conf_base = bus_alloc_resource(dev, SYS_RES_IOPORT, &mss->conf_rid,
1600 0, ~0, 8, RF_ACTIVE);
1601
1602 if (mss->conf_base == NULL) {
1603 mss_release_resources(mss, dev);
1604 return ENXIO;
1605 }
1606
1607 base = isa_get_port(parent);
1608
1609 ctl = 0x40; /* CS4231 enable */
1610 if (isa_get_drq(dev) > 3)
1611 ctl |= 0x10; /* 16-bit dma channel 1 */
1612 if ((flags & DV_F_DUAL_DMA) != 0 && (flags & DV_F_DRQ_MASK) > 3)
1613 ctl |= 0x20; /* 16-bit dma channel 2 */
1614 ctl |= (base >> 4) & 0x0f; /* 2X0 -> 3XC */
1615 port_wr(mss->conf_base, 6, ctl);
1616
1617skip_setup:
1618 return mss_doattach(dev, mss);
1619}
1620
1621static device_method_t guspcm_methods[] = {
1622 DEVMETHOD(device_probe, guspcm_probe),
1623 DEVMETHOD(device_attach, guspcm_attach),
1624
1625 { 0, 0 }
1626};
1627
1628static driver_t guspcm_driver = {
1629 "pcm",
1630 guspcm_methods,
1631 sizeof(snddev_info),
1632};
1633
1634DRIVER_MODULE(guspcm, gusc, guspcm_driver, pcm_devclass, 0, 0);
1635#endif /* NGUSC > 0 */
1636
1637static int
1457mssmix_init(snd_mixer *m)
1458{
1459 struct mss_info *mss = mix_getdevinfo(m);
1460
1461 mix_setdevs(m, MODE2_MIXER_DEVICES);
1462 mix_setrecdevs(m, MSS_REC_DEVICES);
1463 switch(mss->bd_id) {
1464 case MD_OPTI931:
1465 mix_setdevs(m, OPTI931_MIXER_DEVICES);
1466 ad_write(mss, 20, 0x88);
1467 ad_write(mss, 21, 0x88);
1468 break;
1469
1470 case MD_AD1848:
1471 mix_setdevs(m, MODE1_MIXER_DEVICES);
1472 break;
1473
1474 case MD_GUSPNP:
1638mssmix_init(snd_mixer *m)
1639{
1640 struct mss_info *mss = mix_getdevinfo(m);
1641
1642 mix_setdevs(m, MODE2_MIXER_DEVICES);
1643 mix_setrecdevs(m, MSS_REC_DEVICES);
1644 switch(mss->bd_id) {
1645 case MD_OPTI931:
1646 mix_setdevs(m, OPTI931_MIXER_DEVICES);
1647 ad_write(mss, 20, 0x88);
1648 ad_write(mss, 21, 0x88);
1649 break;
1650
1651 case MD_AD1848:
1652 mix_setdevs(m, MODE1_MIXER_DEVICES);
1653 break;
1654
1655 case MD_GUSPNP:
1656 case MD_GUSMAX:
1475 /* this is only necessary in mode 3 ... */
1476 ad_write(mss, 22, 0x88);
1477 ad_write(mss, 23, 0x88);
1478 break;
1479 }
1480 return 0;
1481}
1482

--- 143 unchanged lines hidden (view full) ---

1626 struct mss_chinfo *ch = data;
1627
1628 switch(ch->parent->bd_id) {
1629 case MD_OPTI931:
1630 return &opti931_caps;
1631 break;
1632
1633 case MD_GUSPNP:
1657 /* this is only necessary in mode 3 ... */
1658 ad_write(mss, 22, 0x88);
1659 ad_write(mss, 23, 0x88);
1660 break;
1661 }
1662 return 0;
1663}
1664

--- 143 unchanged lines hidden (view full) ---

1808 struct mss_chinfo *ch = data;
1809
1810 switch(ch->parent->bd_id) {
1811 case MD_OPTI931:
1812 return &opti931_caps;
1813 break;
1814
1815 case MD_GUSPNP:
1816 case MD_GUSMAX:
1634 return &guspnp_caps;
1635 break;
1636
1637 default:
1638 return &mss_caps;
1639 break;
1640 }
1641}
1642
1643#endif /* NPCM > 0 */
1817 return &guspnp_caps;
1818 break;
1819
1820 default:
1821 return &mss_caps;
1822 break;
1823 }
1824}
1825
1826#endif /* NPCM > 0 */