es137x.c (170721) | es137x.c (170815) |
---|---|
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 | 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 $"); | 62SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pci/es137x.c 170815 2007-06-16 03:37:28Z 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; | 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); | 1483 device_t dev; 1484 uint32_t val, set; 1485 int recsrc, level, err; 1486 1487 dev = oidp->oid_arg1; 1488 d = device_get_softc(dev); |
1490 if (d == NULL || d->mixer_dev == NULL || d->mixer_dev->si_drv1 == NULL) | 1489 if (!PCM_REGISTERED(d) || d->mixer_dev == NULL || 1490 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); | 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) | 1507 PCM_ACQUIRE_QUICK(d); 1508 m = (d->mixer_dev != NULL) ? d->mixer_dev->si_drv1 : NULL; 1509 if (m == NULL) { 1510 PCM_RELEASE_QUICK(d); 1511 return (ENODEV); 1512 } 1513 if (mixer_busy(m) != 0) { 1514 PCM_RELEASE_QUICK(d); |
1509 return (EBUSY); | 1515 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); | 1516 } 1517 level = mix_get(m, SOUND_MIXER_PCM); 1518 recsrc = mix_getrecsrc(m); 1519 if (level < 0 || recsrc < 0) { 1520 PCM_RELEASE_QUICK(d); 1521 return (ENXIO); 1522 } |
1519 1520 ES_LOCK(es); 1521 if (es->ctrl & (CTRL_ADC_EN | CTRL_DAC1_EN | CTRL_DAC2_EN)) { 1522 ES_UNLOCK(es); | 1523 1524 ES_LOCK(es); 1525 if (es->ctrl & (CTRL_ADC_EN | CTRL_DAC1_EN | CTRL_DAC2_EN)) { 1526 ES_UNLOCK(es); |
1527 PCM_RELEASE_QUICK(d); |
|
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); | 1528 return (EBUSY); 1529 } 1530 if (val) 1531 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1); 1532 else 1533 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0); 1534 ES_UNLOCK(es); |
1530 m = i_dev->si_drv1; | |
1531 if (!val) { | 1535 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); | 1536 mix_setdevs(m, mix_getdevs(m) | (1 << SOUND_MIXER_SYNTH)); 1537 mix_setrecdevs(m, mix_getrecdevs(m) | (1 << SOUND_MIXER_SYNTH)); 1538 err = mix_set(m, SOUND_MIXER_SYNTH, level & 0x7f, 1539 (level >> 8) & 0x7f); |
1538 } else { | 1540 } 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) & | 1541 err = mix_set(m, SOUND_MIXER_SYNTH, level & 0x7f, 1542 (level >> 8) & 0x7f); 1543 mix_setdevs(m, mix_getdevs(m) & ~(1 << SOUND_MIXER_SYNTH)); 1544 mix_setrecdevs(m, mix_getrecdevs(m) & |
1542 ~(1 << SOUND_MIXER_SYNTH)); | 1545 ~(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) | 1546 } 1547 if (!err) { 1548 level = recsrc; 1549 if (recsrc & (1 << SOUND_MIXER_PCM)) 1550 recsrc |= 1 << SOUND_MIXER_SYNTH; 1551 else if (recsrc & (1 << SOUND_MIXER_SYNTH)) 1552 recsrc |= 1 << SOUND_MIXER_PCM; 1553 if (level != recsrc) |
1553 err = mixer_ioctl(i_dev, 1554 MIXER_WRITE(SOUND_MIXER_RECSRC), 1555 (caddr_t)&recsrc, -1, NULL); | 1554 err = mix_setrecsrc(m, recsrc); |
1556 } | 1555 } |
1556 1557 PCM_RELEASE_QUICK(d); 1558 |
|
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 --- | 1559 return (err); 1560} 1561 1562static int 1563sysctl_es_polling(SYSCTL_HANDLER_ARGS) 1564{ 1565 struct es_info *es; 1566 device_t dev; --- 360 unchanged lines hidden --- |