Deleted Added
sdiff udiff text old ( 170721 ) new ( 170815 )
full compact
1/*-
2 * Support the ENSONIQ AudioPCI board and Creative Labs SoundBlaster PCI
3 * boards based on the ES1370, ES1371 and ES1373 chips.
4 *
5 * Copyright (c) 1999 Russell Cattelan <cattelan@thebarn.com>
6 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
7 * Copyright (c) 1998 by Joachim Kuebart. All rights reserved.
8 *

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

54
55#include <dev/pci/pcireg.h>
56#include <dev/pci/pcivar.h>
57
58#include <sys/sysctl.h>
59
60#include "mixer_if.h"
61
62SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pci/es137x.c 170721 2007-06-14 11:13:38Z ariff $");
63
64#define MEM_MAP_REG 0x14
65
66/* PCI IDs of supported chips */
67#define ES1370_PCI_ID 0x50001274
68#define ES1371_PCI_ID 0x13711274
69#define ES1371_PCI_ID2 0x13713274
70#define CT5880_PCI_ID 0x58801274

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

1475}
1476
1477static int
1478sysctl_es137x_single_pcm_mixer(SYSCTL_HANDLER_ARGS)
1479{
1480 struct es_info *es;
1481 struct snddev_info *d;
1482 struct snd_mixer *m;
1483 struct cdev *i_dev;
1484 device_t dev;
1485 uint32_t val, set;
1486 int recsrc, level, err;
1487
1488 dev = oidp->oid_arg1;
1489 d = device_get_softc(dev);
1490 if (d == NULL || d->mixer_dev == NULL || d->mixer_dev->si_drv1 == NULL)
1491 return (EINVAL);
1492 es = d->devinfo;
1493 if (es == NULL)
1494 return (EINVAL);
1495 ES_LOCK(es);
1496 set = ES_SINGLE_PCM_MIX(es->escfg);
1497 val = set;
1498 ES_UNLOCK(es);
1499 err = sysctl_handle_int(oidp, &val, 0, req);
1500
1501 if (err || req->newptr == NULL)
1502 return (err);
1503 if (!(val == 0 || val == 1))
1504 return (EINVAL);
1505 if (val == set)
1506 return (0);
1507 i_dev = d->mixer_dev;
1508 if (mixer_ioctl(i_dev, 0, (caddr_t)&recsrc, 0, NULL) != EBADF)
1509 return (EBUSY);
1510 err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_PCM), (caddr_t)&level,
1511 -1, NULL);
1512 if (!err)
1513 err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_RECSRC),
1514 (caddr_t)&recsrc, -1, NULL);
1515 if (err)
1516 return (err);
1517 if (level < 0)
1518 return (EINVAL);
1519
1520 ES_LOCK(es);
1521 if (es->ctrl & (CTRL_ADC_EN | CTRL_DAC1_EN | CTRL_DAC2_EN)) {
1522 ES_UNLOCK(es);
1523 return (EBUSY);
1524 }
1525 if (val)
1526 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1);
1527 else
1528 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0);
1529 ES_UNLOCK(es);
1530 m = i_dev->si_drv1;
1531 if (!val) {
1532 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) |
1533 (1 << SOUND_MIXER_SYNTH));
1534 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) |
1535 (1 << SOUND_MIXER_SYNTH));
1536 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH),
1537 (caddr_t)&level, -1, NULL);
1538 } else {
1539 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH),
1540 (caddr_t)&level, -1, NULL);
1541 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) &
1542 ~(1 << SOUND_MIXER_SYNTH));
1543 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) &
1544 ~(1 << SOUND_MIXER_SYNTH));
1545 }
1546 if (!err) {
1547 level = recsrc;
1548 if (recsrc & (1 << SOUND_MIXER_PCM))
1549 recsrc |= 1 << SOUND_MIXER_SYNTH;
1550 else if (recsrc & (1 << SOUND_MIXER_SYNTH))
1551 recsrc |= 1 << SOUND_MIXER_PCM;
1552 if (level != recsrc)
1553 err = mixer_ioctl(i_dev,
1554 MIXER_WRITE(SOUND_MIXER_RECSRC),
1555 (caddr_t)&recsrc, -1, NULL);
1556 }
1557 return (err);
1558}
1559
1560static int
1561sysctl_es_polling(SYSCTL_HANDLER_ARGS)
1562{
1563 struct es_info *es;
1564 device_t dev;

--- 360 unchanged lines hidden ---