Merge git://git.kernel.org/pub/scm/linux/kernel/git/perex/alsa
This commit is contained in:
Коммит
b4103333d7
|
@ -837,8 +837,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||
|
||||
Module for AC'97 motherboards from Intel and compatibles.
|
||||
* Intel i810/810E, i815, i820, i830, i84x, MX440
|
||||
ICH5, ICH6, ICH7, ESB2
|
||||
* SiS 7012 (SiS 735)
|
||||
* NVidia NForce, NForce2
|
||||
* NVidia NForce, NForce2, NForce3, MCP04, CK804
|
||||
CK8, CK8S, MCP501
|
||||
* AMD AMD768, AMD8111
|
||||
* ALi m5455
|
||||
|
||||
|
@ -868,6 +870,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||
--------------------
|
||||
|
||||
Module for Intel ICH (i8x0) chipset MC97 modems.
|
||||
* Intel i810/810E, i815, i820, i830, i84x, MX440
|
||||
ICH5, ICH6, ICH7
|
||||
* SiS 7013 (SiS 735)
|
||||
* NVidia NForce, NForce2, NForce2s, NForce3
|
||||
* AMD AMD8111
|
||||
* ALi m5455
|
||||
|
||||
ac97_clock - AC'97 codec clock base (0 = auto-detect)
|
||||
|
||||
|
|
|
@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime {
|
|||
You need to pass the <function>snd_dma_pci_data(pci)</function>,
|
||||
where pci is the struct <structname>pci_dev</structname> pointer
|
||||
of the chip as well.
|
||||
The <type>snd_sg_buf_t</type> instance is created as
|
||||
The <type>struct snd_sg_buf</type> instance is created as
|
||||
substream->dma_private. You can cast
|
||||
the pointer like:
|
||||
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
struct snd_sg_buf *sgbuf = (struct snd_sg_buf_t*)substream->dma_private;
|
||||
struct snd_sg_buf *sgbuf = (struct snd_sg_buf *)substream->dma_private;
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
|
|
|
@ -363,7 +363,7 @@ static int card_resume(struct pnp_dev *dev)
|
|||
|
||||
int pnp_register_card_driver(struct pnp_card_driver * drv)
|
||||
{
|
||||
int count = 0;
|
||||
int count;
|
||||
struct list_head *pos, *temp;
|
||||
|
||||
drv->link.name = drv->name;
|
||||
|
@ -374,10 +374,15 @@ int pnp_register_card_driver(struct pnp_card_driver * drv)
|
|||
drv->link.suspend = drv->suspend ? card_suspend : NULL;
|
||||
drv->link.resume = drv->resume ? card_resume : NULL;
|
||||
|
||||
count = pnp_register_driver(&drv->link);
|
||||
if (count < 0)
|
||||
return count;
|
||||
|
||||
spin_lock(&pnp_lock);
|
||||
list_add_tail(&drv->global_list, &pnp_card_drivers);
|
||||
spin_unlock(&pnp_lock);
|
||||
pnp_register_driver(&drv->link);
|
||||
|
||||
count = 0;
|
||||
|
||||
list_for_each_safe(pos,temp,&pnp_cards){
|
||||
struct pnp_card *card = list_entry(pos, struct pnp_card, global_list);
|
||||
|
|
|
@ -444,8 +444,8 @@ static unsigned int snd_info_entry_poll(struct file *file, poll_table * wait)
|
|||
return mask;
|
||||
}
|
||||
|
||||
static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static long snd_info_entry_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct snd_info_private_data *data;
|
||||
struct snd_info_entry *entry;
|
||||
|
@ -465,17 +465,6 @@ static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file,
|
|||
return -ENOTTY;
|
||||
}
|
||||
|
||||
/* FIXME: need to unlock BKL to allow preemption */
|
||||
static int snd_info_entry_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int err;
|
||||
unlock_kernel();
|
||||
err = _snd_info_entry_ioctl(inode, file, cmd, arg);
|
||||
lock_kernel();
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
|
@ -499,15 +488,15 @@ static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
|
||||
static struct file_operations snd_info_entry_operations =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = snd_info_entry_llseek,
|
||||
.read = snd_info_entry_read,
|
||||
.write = snd_info_entry_write,
|
||||
.poll = snd_info_entry_poll,
|
||||
.ioctl = snd_info_entry_ioctl,
|
||||
.mmap = snd_info_entry_mmap,
|
||||
.open = snd_info_entry_open,
|
||||
.release = snd_info_entry_release,
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = snd_info_entry_llseek,
|
||||
.read = snd_info_entry_read,
|
||||
.write = snd_info_entry_write,
|
||||
.poll = snd_info_entry_poll,
|
||||
.unlocked_ioctl = snd_info_entry_ioctl,
|
||||
.mmap = snd_info_entry_mmap,
|
||||
.open = snd_info_entry_open,
|
||||
.release = snd_info_entry_release,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -789,7 +789,7 @@ static int __init snd_uart16550_create(struct snd_card *card,
|
|||
|
||||
if ((err = snd_uart16550_detect(uart)) <= 0) {
|
||||
printk(KERN_ERR "no UART detected at 0x%lx\n", iobase);
|
||||
return err;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (irq >= 0 && irq != SNDRV_AUTO_IRQ) {
|
||||
|
|
|
@ -109,7 +109,9 @@ module_param_array(wssdma, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp_registered;
|
||||
#endif
|
||||
|
||||
#define CMI8330_RMUX3D 16
|
||||
#define CMI8330_MUTEMUX 17
|
||||
|
@ -672,8 +674,10 @@ static void __init_or_module snd_cmi8330_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_registered)
|
||||
pnp_unregister_card_driver(&cmi8330_pnpc_driver);
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&snd_cmi8330_driver);
|
||||
|
@ -700,11 +704,13 @@ static int __init alsa_card_cmi8330_init(void)
|
|||
cards++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
err = pnp_register_card_driver(&cmi8330_pnpc_driver);
|
||||
if (err >= 0) {
|
||||
pnp_registered = 1;
|
||||
cards += err;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!cards) {
|
||||
#ifdef MODULE
|
||||
|
|
|
@ -75,8 +75,10 @@ MODULE_SUPPORTED_DEVICE("{{Crystal Semiconductors,CS4235},"
|
|||
|
||||
#ifdef CS4232
|
||||
#define IDENT "CS4232"
|
||||
#define CS423X_DRIVER "snd_cs4232"
|
||||
#else
|
||||
#define IDENT "CS4236+"
|
||||
#define CS423X_DRIVER "snd_cs4236"
|
||||
#endif
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
|
||||
|
@ -125,10 +127,12 @@ module_param_array(dma2, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver.");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnpc_registered;
|
||||
#ifdef CS4232
|
||||
static int pnp_registered;
|
||||
#endif
|
||||
#endif /* CONFIG_PNP */
|
||||
|
||||
struct snd_card_cs4236 {
|
||||
struct snd_cs4231 *chip;
|
||||
|
@ -158,7 +162,6 @@ MODULE_DEVICE_TABLE(pnp, snd_cs4232_pnpbiosids);
|
|||
#endif /* CS4232 */
|
||||
|
||||
#ifdef CS4232
|
||||
#define CS423X_DRIVER "snd_cs4232"
|
||||
#define CS423X_ISAPNP_DRIVER "cs4232_isapnp"
|
||||
static struct pnp_card_device_id snd_cs423x_pnpids[] = {
|
||||
/* Philips PCA70PS */
|
||||
|
@ -175,11 +178,12 @@ static struct pnp_card_device_id snd_cs423x_pnpids[] = {
|
|||
{ .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } },
|
||||
/* SIC CrystalWave 32 (CS4232) */
|
||||
{ .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
|
||||
/* Netfinity 3000 on-board soundcard */
|
||||
{ .id = "CSCe825", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC010f" } } },
|
||||
/* --- */
|
||||
{ .id = "" } /* end */
|
||||
};
|
||||
#else /* CS4236 */
|
||||
#define CS423X_DRIVER "snd_cs4236"
|
||||
#define CS423X_ISAPNP_DRIVER "cs4236_isapnp"
|
||||
static struct pnp_card_device_id snd_cs423x_pnpids[] = {
|
||||
/* Intel Marlin Spike Motherboard - CS4235 */
|
||||
|
@ -747,12 +751,14 @@ static void __init_or_module snd_cs423x_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnpc_registered)
|
||||
pnp_unregister_card_driver(&cs423x_pnpc_driver);
|
||||
#ifdef CS4232
|
||||
if (pnp_registered)
|
||||
pnp_unregister_driver(&cs4232_pnp_driver);
|
||||
#endif
|
||||
#endif /* CONFIG_PNP */
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&cs423x_nonpnp_driver);
|
||||
|
@ -778,6 +784,7 @@ static int __init alsa_card_cs423x_init(void)
|
|||
platform_devices[i] = device;
|
||||
cards++;
|
||||
}
|
||||
#ifdef CONFIG_PNP
|
||||
#ifdef CS4232
|
||||
i = pnp_register_driver(&cs4232_pnp_driver);
|
||||
if (i >= 0) {
|
||||
|
@ -790,6 +797,8 @@ static int __init alsa_card_cs423x_init(void)
|
|||
pnpc_registered = 1;
|
||||
cards += i;
|
||||
}
|
||||
#endif /* CONFIG_PNP */
|
||||
|
||||
if (!cards) {
|
||||
#ifdef MODULE
|
||||
printk(KERN_ERR IDENT " soundcard not found or device busy\n");
|
||||
|
|
|
@ -1878,9 +1878,9 @@ module_param_array(dma2, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver.");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
static int pnp_registered;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp_registered;
|
||||
|
||||
static struct pnp_card_device_id snd_audiodrive_pnpids[] = {
|
||||
/* ESS 1868 (integrated on Compaq dual P-Pro motherboard and Genius 18PnP 3D) */
|
||||
|
@ -2209,8 +2209,10 @@ static void __init_or_module snd_es18xx_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_registered)
|
||||
pnp_unregister_card_driver(&es18xx_pnpc_driver);
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&snd_es18xx_nonpnp_driver);
|
||||
|
@ -2237,11 +2239,13 @@ static int __init alsa_card_es18xx_init(void)
|
|||
cards++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
i = pnp_register_card_driver(&es18xx_pnpc_driver);
|
||||
if (i >= 0) {
|
||||
pnp_registered = 1;
|
||||
cards += i;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(!cards) {
|
||||
#ifdef MODULE
|
||||
|
|
|
@ -195,7 +195,7 @@ static int __init snd_gusclassic_probe(struct platform_device *pdev)
|
|||
goto _err;
|
||||
}
|
||||
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1);
|
||||
if (dma2 >= 0)
|
||||
if (xdma2 >= 0)
|
||||
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
||||
|
||||
snd_card_set_dev(card, &pdev->dev);
|
||||
|
|
|
@ -91,8 +91,10 @@ module_param_array(opl3sa3_ymode, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi.");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp_registered;
|
||||
static int pnpc_registered;
|
||||
#endif
|
||||
|
||||
/* control ports */
|
||||
#define OPL3SA2_PM_CTRL 0x01
|
||||
|
@ -721,7 +723,7 @@ static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev)
|
|||
}
|
||||
sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
|
||||
card->shortname, chip->port, xirq, xdma1);
|
||||
if (dma2 >= 0)
|
||||
if (xdma2 >= 0)
|
||||
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
||||
|
||||
return snd_card_register(card);
|
||||
|
@ -779,7 +781,7 @@ static int snd_opl3sa2_pnp_resume(struct pnp_dev *pdev)
|
|||
#endif
|
||||
|
||||
static struct pnp_driver opl3sa2_pnp_driver = {
|
||||
.name = "opl3sa2-pnpbios",
|
||||
.name = "snd-opl3sa2-pnpbios",
|
||||
.id_table = snd_opl3sa2_pnpbiosids,
|
||||
.probe = snd_opl3sa2_pnp_detect,
|
||||
.remove = __devexit_p(snd_opl3sa2_pnp_remove),
|
||||
|
@ -846,7 +848,7 @@ static int snd_opl3sa2_pnp_cresume(struct pnp_card_link *pcard)
|
|||
|
||||
static struct pnp_card_driver opl3sa2_pnpc_driver = {
|
||||
.flags = PNP_DRIVER_RES_DISABLE,
|
||||
.name = "opl3sa2",
|
||||
.name = "snd-opl3sa2-cpnp",
|
||||
.id_table = snd_opl3sa2_pnpids,
|
||||
.probe = snd_opl3sa2_pnp_cdetect,
|
||||
.remove = __devexit_p(snd_opl3sa2_pnp_cremove),
|
||||
|
@ -929,10 +931,12 @@ static void __init_or_module snd_opl3sa2_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnpc_registered)
|
||||
pnp_unregister_card_driver(&opl3sa2_pnpc_driver);
|
||||
if (pnp_registered)
|
||||
pnp_unregister_driver(&opl3sa2_pnp_driver);
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&snd_opl3sa2_nonpnp_driver);
|
||||
|
@ -961,6 +965,7 @@ static int __init alsa_card_opl3sa2_init(void)
|
|||
cards++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
err = pnp_register_driver(&opl3sa2_pnp_driver);
|
||||
if (err >= 0) {
|
||||
pnp_registered = 1;
|
||||
|
@ -971,6 +976,7 @@ static int __init alsa_card_opl3sa2_init(void)
|
|||
pnpc_registered = 1;
|
||||
cards += err;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!cards) {
|
||||
#ifdef MODULE
|
||||
|
|
|
@ -1349,7 +1349,7 @@ static int snd_opti93x_pcm(struct snd_opti93x *codec, int device, struct snd_pcm
|
|||
int error;
|
||||
struct snd_pcm *pcm;
|
||||
|
||||
if ((error = snd_pcm_new(codec->card, "OPTi 82C93X", device, 1, 1, &pcm)))
|
||||
if ((error = snd_pcm_new(codec->card, "OPTi 82C93X", device, 1, 1, &pcm)) < 0)
|
||||
return error;
|
||||
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_opti93x_playback_ops);
|
||||
|
|
|
@ -179,6 +179,8 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
|
|||
{ .id = "CTL0086", .devs = { { "CTL0041" } } },
|
||||
/* Sound Blaster Vibra16X */
|
||||
{ .id = "CTL00f0", .devs = { { "CTL0043" } } },
|
||||
/* Sound Blaster 16 (Virtual PC 2004) */
|
||||
{ .id = "tBA03b0", .devs = { {.id="PNPb003" } } },
|
||||
#else /* SNDRV_SBAWE defined */
|
||||
/* Sound Blaster AWE 32 PnP */
|
||||
{ .id = "CTL0035", .devs = { { "CTL0031" }, { "CTL0021" } } },
|
||||
|
@ -235,8 +237,6 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
|
|||
{ .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } },
|
||||
{ .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } },
|
||||
#endif /* SNDRV_SBAWE */
|
||||
/* Sound Blaster 16 PnP (Virtual PC 2004)*/
|
||||
{ .id = "tBA03b0", .devs = { { "PNPb003" } } },
|
||||
{ .id = "", }
|
||||
};
|
||||
|
||||
|
|
|
@ -69,9 +69,9 @@ module_param_array(dma, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
static int pnp_registered;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp_registered;
|
||||
static struct pnp_card_device_id sscape_pnpids[] = {
|
||||
{ .id = "ENS3081", .devs = { { "ENS0000" } } },
|
||||
{ .id = "" } /* end */
|
||||
|
@ -1391,8 +1391,10 @@ static void __init_or_module sscape_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_registered)
|
||||
pnp_unregister_card_driver(&sscape_pnpc_driver);
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&snd_sscape_driver);
|
||||
|
@ -1466,8 +1468,10 @@ static int __init sscape_init(void)
|
|||
ret = sscape_manual_probe();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0)
|
||||
pnp_registered = 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,10 +84,9 @@ module_param_array(use_cs4232_midi, bool, NULL, 0444);
|
|||
MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)");
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
static int pnp_registered;
|
||||
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp_registered;
|
||||
|
||||
static struct pnp_card_device_id snd_wavefront_pnpids[] = {
|
||||
/* Tropez */
|
||||
|
@ -695,8 +694,10 @@ static void __init_or_module snd_wavefront_unregister_all(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_registered)
|
||||
pnp_unregister_card_driver(&wavefront_pnpc_driver);
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
|
||||
platform_device_unregister(platform_devices[i]);
|
||||
platform_driver_unregister(&snd_wavefront_driver);
|
||||
|
@ -725,11 +726,13 @@ static int __init alsa_card_wavefront_init(void)
|
|||
cards++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
i = pnp_register_card_driver(&wavefront_pnpc_driver);
|
||||
if (i >= 0) {
|
||||
pnp_registered = 1;
|
||||
cards += i;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!cards) {
|
||||
#ifdef MODULE
|
||||
|
|
|
@ -866,7 +866,7 @@ wavefront_send_sample (snd_wavefront_t *dev,
|
|||
divided by 2.
|
||||
*/
|
||||
|
||||
u16 sample_short;
|
||||
u16 sample_short = 0;
|
||||
u32 length;
|
||||
u16 __user *data_end = NULL;
|
||||
unsigned int i;
|
||||
|
|
|
@ -1621,8 +1621,27 @@ static const struct snd_kcontrol_new snd_ac97_ad1981x_jack_sense[] = {
|
|||
AC97_SINGLE("Line Jack Sense", AC97_AD_JACK_SPDIF, 12, 1, 0),
|
||||
};
|
||||
|
||||
/* black list to avoid HP/Line jack-sense controls
|
||||
* (SS vendor << 16 | device)
|
||||
*/
|
||||
static unsigned int ad1981_jacks_blacklist[] = {
|
||||
0x10140554, /* Thinkpad T42p/R50p */
|
||||
0 /* end */
|
||||
};
|
||||
|
||||
static int check_list(struct snd_ac97 *ac97, const unsigned int *list)
|
||||
{
|
||||
u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device;
|
||||
for (; *list; list++)
|
||||
if (*list == subid)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int patch_ad1981a_specific(struct snd_ac97 * ac97)
|
||||
{
|
||||
if (check_list(ac97, ad1981_jacks_blacklist))
|
||||
return 0;
|
||||
return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
|
||||
ARRAY_SIZE(snd_ac97_ad1981x_jack_sense));
|
||||
}
|
||||
|
@ -1635,22 +1654,26 @@ static struct snd_ac97_build_ops patch_ad1981a_build_ops = {
|
|||
#endif
|
||||
};
|
||||
|
||||
/* white list to enable HP jack-sense bits
|
||||
* (SS vendor << 16 | device)
|
||||
*/
|
||||
static unsigned int ad1981_jacks_whitelist[] = {
|
||||
0x0e11005a, /* HP nc4000/4010 */
|
||||
0x103c0890, /* HP nc6000 */
|
||||
0x103c0938, /* HP nc4220 */
|
||||
0x103c099c, /* HP nx6110 */
|
||||
0x103c0944, /* HP nc6220 */
|
||||
0x103c0934, /* HP nc8220 */
|
||||
0x103c006d, /* HP nx9105 */
|
||||
0x17340088, /* FSC Scenic-W */
|
||||
0 /* end */
|
||||
};
|
||||
|
||||
static void check_ad1981_hp_jack_sense(struct snd_ac97 *ac97)
|
||||
{
|
||||
u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device;
|
||||
switch (subid) {
|
||||
case 0x0e11005a: /* HP nc4000/4010 */
|
||||
case 0x103c0890: /* HP nc6000 */
|
||||
case 0x103c0938: /* HP nc4220 */
|
||||
case 0x103c099c: /* HP nx6110 */
|
||||
case 0x103c0944: /* HP nc6220 */
|
||||
case 0x103c0934: /* HP nc8220 */
|
||||
case 0x103c006d: /* HP nx9105 */
|
||||
case 0x17340088: /* FSC Scenic-W */
|
||||
if (check_list(ac97, ad1981_jacks_whitelist))
|
||||
/* enable headphone jack sense */
|
||||
snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int patch_ad1981a(struct snd_ac97 *ac97)
|
||||
|
@ -1672,6 +1695,8 @@ static int patch_ad1981b_specific(struct snd_ac97 *ac97)
|
|||
|
||||
if ((err = patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1)) < 0)
|
||||
return err;
|
||||
if (check_list(ac97, ad1981_jacks_blacklist))
|
||||
return 0;
|
||||
return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
|
||||
ARRAY_SIZE(snd_ac97_ad1981x_jack_sense));
|
||||
}
|
||||
|
@ -2210,9 +2235,9 @@ static void alc850_update_jacks(struct snd_ac97 *ac97)
|
|||
/* Vref disable (bit12), 1kOhm (bit13) */
|
||||
snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13),
|
||||
shared ? (1<<12) : (1<<13));
|
||||
/* MIC-IN = 1, CENTER-LFE = 2 */
|
||||
/* MIC-IN = 1, CENTER-LFE = 5 */
|
||||
snd_ac97_update_bits(ac97, AC97_ALC850_JACK_SELECT, 7 << 4,
|
||||
shared ? (2<<4) : (1<<4));
|
||||
shared ? (5<<4) : (1<<4));
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new snd_ac97_controls_alc850[] = {
|
||||
|
|
|
@ -279,7 +279,7 @@ struct snd_ali {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_ali_ids[] = {
|
||||
{0x10b9, 0x5451, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0},
|
||||
{0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_ali_ids);
|
||||
|
|
|
@ -849,7 +849,7 @@ static int
|
|||
snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
vortex_t *vortex = snd_kcontrol_chip(kcontrol);
|
||||
int i, count;
|
||||
int i, count = 0;
|
||||
u16 peaks[20];
|
||||
|
||||
vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count);
|
||||
|
|
|
@ -781,6 +781,8 @@ static struct pci_device_id snd_bt87x_ids[] = {
|
|||
BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000),
|
||||
/* Viewcast Osprey 200 */
|
||||
BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100),
|
||||
/* AVerMedia Studio No. 103, 203, ...? */
|
||||
BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, 48000),
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_bt87x_ids);
|
||||
|
@ -808,7 +810,7 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
|
|||
const struct pci_device_id *supported;
|
||||
|
||||
supported = pci_match_device(&driver, pci);
|
||||
if (supported)
|
||||
if (supported && supported->driver_data > 0)
|
||||
return supported->driver_data;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
|
||||
|
|
|
@ -199,7 +199,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
|
|||
.name = "MSI K8N Diamond MB [SB0438]",
|
||||
.gpio_type = 1,
|
||||
.i2c_adc = 1 } ,
|
||||
/* Shuttle XPC SD31P which has an onboard Creative Labs Sound Blaster Live! 24-bit EAX
|
||||
/* Shuttle XPC SD31P which has an onboard Creative Labs
|
||||
* Sound Blaster Live! 24-bit EAX
|
||||
* high-definition 7.1 audio processor".
|
||||
* Added using info from andrewvegan in alsa bug #1298
|
||||
*/
|
||||
|
@ -207,6 +208,15 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
|
|||
.name = "Shuttle XPC SD31P [SD31P]",
|
||||
.gpio_type = 1,
|
||||
.i2c_adc = 1 } ,
|
||||
/* Shuttle XPC SD11G5 which has an onboard Creative Labs
|
||||
* Sound Blaster Live! 24-bit EAX
|
||||
* high-definition 7.1 audio processor".
|
||||
* Fixes ALSA bug#1600
|
||||
*/
|
||||
{ .serial = 0x30411297,
|
||||
.name = "Shuttle XPC SD11G5 [SD11G5]",
|
||||
.gpio_type = 1,
|
||||
.i2c_adc = 1 } ,
|
||||
{ .serial = 0,
|
||||
.name = "AudigyLS [Unknown]" }
|
||||
};
|
||||
|
|
|
@ -675,7 +675,7 @@ cs46xx_dsp_create_src_task_scb(struct snd_cs46xx * chip, char * scb_name,
|
|||
if (pass_through) {
|
||||
/* wont work with any other rate than
|
||||
the native DSP rate */
|
||||
snd_assert (rate = 48000);
|
||||
snd_assert (rate == 48000);
|
||||
|
||||
scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb,
|
||||
dest,"DMAREADER",parent_scb,
|
||||
|
|
|
@ -46,8 +46,10 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
|||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
static struct pci_device_id snd_cs5535audio_ids[] = {
|
||||
{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO, PCI_ANY_ID,
|
||||
PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_AUDIO,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -759,6 +759,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
|||
"Master Mono Playback Volume",
|
||||
"PCM Out Path & Mute",
|
||||
"Mono Output Select",
|
||||
"Front Playback Switch",
|
||||
"Front Playback Volume",
|
||||
"Surround Playback Switch",
|
||||
"Surround Playback Volume",
|
||||
"Center Playback Switch",
|
||||
|
@ -829,9 +831,9 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
|||
}
|
||||
if (emu->audigy) {
|
||||
/* set master volume to 0 dB */
|
||||
snd_ac97_write(emu->ac97, AC97_MASTER, 0x0000);
|
||||
snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
|
||||
/* set capture source to mic */
|
||||
snd_ac97_write(emu->ac97, AC97_REC_SEL, 0x0000);
|
||||
snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
|
||||
c = audigy_remove_ctls;
|
||||
} else {
|
||||
/*
|
||||
|
@ -844,8 +846,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
|||
snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
|
||||
}
|
||||
/* remove unused AC97 controls */
|
||||
snd_ac97_write(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
|
||||
snd_ac97_write(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
|
||||
snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
|
||||
snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
|
||||
c = emu10k1_remove_ctls;
|
||||
}
|
||||
for (; *c; c++)
|
||||
|
|
|
@ -75,6 +75,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
|
|||
"{Intel, ICH6M},"
|
||||
"{Intel, ICH7},"
|
||||
"{Intel, ESB2},"
|
||||
"{Intel, ICH8},"
|
||||
"{ATI, SB450},"
|
||||
"{VIA, VT8251},"
|
||||
"{VIA, VT8237A},"
|
||||
|
@ -1586,6 +1587,7 @@ static struct pci_device_id azx_ids[] = {
|
|||
{ 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH6 */
|
||||
{ 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */
|
||||
{ 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */
|
||||
{ 0x8086, 0x284b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH8 */
|
||||
{ 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */
|
||||
{ 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */
|
||||
{ 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */
|
||||
|
|
|
@ -1668,6 +1668,7 @@ static struct hda_board_config alc880_cfg_tbl[] = {
|
|||
{ .pci_subvendor = 0x1043, .pci_subdevice = 0x8196, .config = ALC880_6ST }, /* ASUS P5GD1-HVM */
|
||||
{ .pci_subvendor = 0x1043, .pci_subdevice = 0x81b4, .config = ALC880_6ST },
|
||||
{ .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_6ST }, /* Acer APFV */
|
||||
{ .pci_subvendor = 0x1458, .pci_subdevice = 0xa102, .config = ALC880_6ST }, /* Gigabyte K8N51 */
|
||||
|
||||
{ .modelname = "6stack-digout", .config = ALC880_6ST_DIG },
|
||||
{ .pci_subvendor = 0x2668, .pci_subdevice = 0x8086, .config = ALC880_6ST_DIG },
|
||||
|
@ -2475,7 +2476,7 @@ static struct hda_verb alc260_init_verbs[] = {
|
|||
/* LINE-2 is used for line-out in rear */
|
||||
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||
/* select line-out */
|
||||
{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
|
||||
{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
|
||||
/* LINE-OUT pin */
|
||||
{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||
/* enable HP */
|
||||
|
@ -2945,6 +2946,8 @@ static int alc260_auto_init(struct hda_codec *codec)
|
|||
*/
|
||||
static struct hda_board_config alc260_cfg_tbl[] = {
|
||||
{ .modelname = "basic", .config = ALC260_BASIC },
|
||||
{ .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb,
|
||||
.config = ALC260_BASIC }, /* Sony VAIO */
|
||||
{ .modelname = "hp", .config = ALC260_HP },
|
||||
{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP },
|
||||
{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP },
|
||||
|
@ -3414,12 +3417,12 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = {
|
|||
* configuration and preset
|
||||
*/
|
||||
static struct hda_board_config alc882_cfg_tbl[] = {
|
||||
{ .modelname = "3stack-dig", .config = ALC861_3ST_DIG },
|
||||
{ .modelname = "6stack-dig", .config = ALC861_6ST_DIG },
|
||||
{ .modelname = "3stack-dig", .config = ALC882_3ST_DIG },
|
||||
{ .modelname = "6stack-dig", .config = ALC882_6ST_DIG },
|
||||
{ .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */
|
||||
{ .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */
|
||||
{ .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* ECS */
|
||||
{ .modelname = "auto", .config = ALC861_AUTO },
|
||||
{ .modelname = "auto", .config = ALC882_AUTO },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -297,6 +297,7 @@ static int patch_si3054(struct hda_codec *codec)
|
|||
struct hda_codec_preset snd_hda_preset_si3054[] = {
|
||||
{ .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 },
|
||||
{ .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 },
|
||||
{ .id = 0x11c13026, .name = "Si3054", .patch = patch_si3054 },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -50,10 +50,11 @@ struct sigmatel_spec {
|
|||
unsigned int surr_switch: 1;
|
||||
unsigned int line_switch: 1;
|
||||
unsigned int mic_switch: 1;
|
||||
unsigned int alt_switch: 1;
|
||||
|
||||
/* playback */
|
||||
struct hda_multi_out multiout;
|
||||
hda_nid_t dac_nids[4];
|
||||
hda_nid_t dac_nids[5];
|
||||
|
||||
/* capture */
|
||||
hda_nid_t *adc_nids;
|
||||
|
@ -73,7 +74,7 @@ struct sigmatel_spec {
|
|||
|
||||
/* capture source */
|
||||
struct hda_input_mux *input_mux;
|
||||
unsigned int cur_mux[2];
|
||||
unsigned int cur_mux[3];
|
||||
|
||||
/* i/o switches */
|
||||
unsigned int io_switch[2];
|
||||
|
@ -107,6 +108,14 @@ static hda_nid_t stac922x_mux_nids[2] = {
|
|||
0x12, 0x13,
|
||||
};
|
||||
|
||||
static hda_nid_t stac927x_adc_nids[3] = {
|
||||
0x07, 0x08, 0x09
|
||||
};
|
||||
|
||||
static hda_nid_t stac927x_mux_nids[3] = {
|
||||
0x15, 0x16, 0x17
|
||||
};
|
||||
|
||||
static hda_nid_t stac9200_pin_nids[8] = {
|
||||
0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
|
||||
};
|
||||
|
@ -116,6 +125,12 @@ static hda_nid_t stac922x_pin_nids[10] = {
|
|||
0x0f, 0x10, 0x11, 0x15, 0x1b,
|
||||
};
|
||||
|
||||
static hda_nid_t stac927x_pin_nids[14] = {
|
||||
0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
|
||||
0x0f, 0x10, 0x11, 0x12, 0x13,
|
||||
0x14, 0x21, 0x22, 0x23,
|
||||
};
|
||||
|
||||
static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
|
@ -155,6 +170,12 @@ static struct hda_verb stac922x_core_init[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static struct hda_verb stac927x_core_init[] = {
|
||||
/* set master volume and direct control */
|
||||
{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
|
||||
{}
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new stac9200_mixer[] = {
|
||||
HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
|
||||
|
@ -183,10 +204,26 @@ static struct snd_kcontrol_new stac922x_mixer[] = {
|
|||
.put = stac92xx_mux_enum_put,
|
||||
},
|
||||
HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Capture Switch", 0x17, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mux Capture Volume", 0x12, 0x0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static snd_kcontrol_new_t stac927x_mixer[] = {
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Input Source",
|
||||
.count = 1,
|
||||
.info = stac92xx_mux_enum_info,
|
||||
.get = stac92xx_mux_enum_get,
|
||||
.put = stac92xx_mux_enum_put,
|
||||
},
|
||||
HDA_CODEC_VOLUME("InMux Capture Volume", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("InVol Capture Volume", 0x18, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1b, 0x0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static int stac92xx_build_controls(struct hda_codec *codec)
|
||||
{
|
||||
struct sigmatel_spec *spec = codec->spec;
|
||||
|
@ -240,14 +277,14 @@ static unsigned int ref922x_pin_configs[10] = {
|
|||
};
|
||||
|
||||
static unsigned int d945gtp3_pin_configs[10] = {
|
||||
0x0221401f, 0x01a19022, 0x01813021, 0x01114010,
|
||||
0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
|
||||
0x40000100, 0x40000100, 0x40000100, 0x40000100,
|
||||
0x02a19120, 0x40000100,
|
||||
};
|
||||
|
||||
static unsigned int d945gtp5_pin_configs[10] = {
|
||||
0x0221401f, 0x01111012, 0x01813024, 0x01114010,
|
||||
0x01a19021, 0x01116011, 0x01452130, 0x40000100,
|
||||
0x0221401f, 0x01011012, 0x01813024, 0x01014010,
|
||||
0x01a19021, 0x01016011, 0x01452130, 0x40000100,
|
||||
0x02a19320, 0x40000100,
|
||||
};
|
||||
|
||||
|
@ -274,6 +311,28 @@ static struct hda_board_config stac922x_cfg_tbl[] = {
|
|||
{ .pci_subvendor = PCI_VENDOR_ID_INTEL,
|
||||
.pci_subdevice = 0x0013,
|
||||
.config = STAC_D945GTP5 }, /* Intel D955XBK - 5 Stack */
|
||||
{ .pci_subvendor = PCI_VENDOR_ID_INTEL,
|
||||
.pci_subdevice = 0x0417,
|
||||
.config = STAC_D945GTP5 }, /* Intel D975XBK - 5 Stack */
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static unsigned int ref927x_pin_configs[14] = {
|
||||
0x01813122, 0x01a19021, 0x01014010, 0x01016011,
|
||||
0x01012012, 0x01011014, 0x40000100, 0x40000100,
|
||||
0x40000100, 0x40000100, 0x40000100, 0x01441030,
|
||||
0x01c41030, 0x40000100,
|
||||
};
|
||||
|
||||
static unsigned int *stac927x_brd_tbl[] = {
|
||||
ref927x_pin_configs,
|
||||
};
|
||||
|
||||
static struct hda_board_config stac927x_cfg_tbl[] = {
|
||||
{ .modelname = "ref",
|
||||
.pci_subvendor = PCI_VENDOR_ID_INTEL,
|
||||
.pci_subdevice = 0x2668, /* DFI LanParty */
|
||||
.config = STAC_REF }, /* SigmaTel reference board */
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
|
@ -408,11 +467,23 @@ static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
|
||||
.substreams = 1,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
.nid = 0x06, /* NID to query formats and rates */
|
||||
.ops = {
|
||||
.open = stac92xx_playback_pcm_open,
|
||||
.prepare = stac92xx_playback_pcm_prepare,
|
||||
.cleanup = stac92xx_playback_pcm_cleanup
|
||||
},
|
||||
};
|
||||
|
||||
static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
|
||||
.substreams = 2,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
.nid = 0x06, /* NID to query formats and rates */
|
||||
/* NID is set in stac92xx_build_pcms */
|
||||
.ops = {
|
||||
.prepare = stac92xx_capture_pcm_prepare,
|
||||
.cleanup = stac92xx_capture_pcm_cleanup
|
||||
|
@ -430,6 +501,14 @@ static int stac92xx_build_pcms(struct hda_codec *codec)
|
|||
info->name = "STAC92xx Analog";
|
||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
|
||||
info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
|
||||
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
|
||||
|
||||
if (spec->alt_switch) {
|
||||
codec->num_pcms++;
|
||||
info++;
|
||||
info->name = "STAC92xx Analog Alt";
|
||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
|
||||
}
|
||||
|
||||
if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
|
||||
codec->num_pcms++;
|
||||
|
@ -588,6 +667,16 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX The line_out pin widget connection list may not be set to the
|
||||
* desired DAC nid. This is the case on 927x where ports A and B can
|
||||
* be routed to several DACs.
|
||||
*
|
||||
* This requires an analysis of the line-out/hp pin configuration
|
||||
* to provide a best fit for pin/DAC configurations that are routable.
|
||||
* For now, 927x DAC4 is not supported and 927x DAC1 output to ports
|
||||
* A and B is not supported.
|
||||
*/
|
||||
/* fill in the dac_nids table from the parsed pin configuration */
|
||||
static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
|
||||
{
|
||||
|
@ -602,7 +691,13 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct aut
|
|||
AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
|
||||
}
|
||||
|
||||
spec->multiout.num_dacs = cfg->line_outs;
|
||||
if (cfg->line_outs)
|
||||
spec->multiout.num_dacs = cfg->line_outs;
|
||||
else if (cfg->hp_pin) {
|
||||
spec->multiout.dac_nids[0] = snd_hda_codec_read(codec, cfg->hp_pin, 0,
|
||||
AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
|
||||
spec->multiout.num_dacs = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -753,19 +848,21 @@ static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
|
|||
stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
|
||||
}
|
||||
|
||||
static int stac922x_parse_auto_config(struct hda_codec *codec)
|
||||
static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
|
||||
{
|
||||
struct sigmatel_spec *spec = codec->spec;
|
||||
int err;
|
||||
|
||||
if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
|
||||
return err;
|
||||
if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)
|
||||
return 0; /* can't find valid pin config */
|
||||
stac92xx_auto_init_multi_out(codec);
|
||||
stac92xx_auto_init_hp_out(codec);
|
||||
if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
|
||||
return err;
|
||||
if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
|
||||
return err;
|
||||
if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)
|
||||
return 0; /* can't find valid pin config */
|
||||
|
||||
if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
|
||||
(err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 ||
|
||||
|
@ -777,11 +874,11 @@ static int stac922x_parse_auto_config(struct hda_codec *codec)
|
|||
spec->surr_switch = 1;
|
||||
|
||||
if (spec->autocfg.dig_out_pin) {
|
||||
spec->multiout.dig_out_nid = 0x08;
|
||||
spec->multiout.dig_out_nid = dig_out;
|
||||
stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN);
|
||||
}
|
||||
if (spec->autocfg.dig_in_pin) {
|
||||
spec->dig_in_nid = 0x09;
|
||||
spec->dig_in_nid = dig_in;
|
||||
stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN);
|
||||
}
|
||||
|
||||
|
@ -827,9 +924,6 @@ static int stac92xx_init(struct hda_codec *codec)
|
|||
|
||||
snd_hda_sequence_write(codec, spec->init);
|
||||
|
||||
stac92xx_auto_init_multi_out(codec);
|
||||
stac92xx_auto_init_hp_out(codec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -996,7 +1090,47 @@ static int patch_stac922x(struct hda_codec *codec)
|
|||
|
||||
spec->multiout.dac_nids = spec->dac_nids;
|
||||
|
||||
err = stac922x_parse_auto_config(codec);
|
||||
err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
|
||||
if (err < 0) {
|
||||
stac92xx_free(codec);
|
||||
return err;
|
||||
}
|
||||
|
||||
codec->patch_ops = stac92xx_patch_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int patch_stac927x(struct hda_codec *codec)
|
||||
{
|
||||
struct sigmatel_spec *spec;
|
||||
int err;
|
||||
|
||||
spec = kzalloc(sizeof(*spec), GFP_KERNEL);
|
||||
if (spec == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
codec->spec = spec;
|
||||
spec->board_config = snd_hda_check_board_config(codec, stac927x_cfg_tbl);
|
||||
if (spec->board_config < 0)
|
||||
snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, using BIOS defaults\n");
|
||||
else {
|
||||
spec->num_pins = 14;
|
||||
spec->pin_nids = stac927x_pin_nids;
|
||||
spec->pin_configs = stac927x_brd_tbl[spec->board_config];
|
||||
stac92xx_set_config_regs(codec);
|
||||
}
|
||||
|
||||
spec->adc_nids = stac927x_adc_nids;
|
||||
spec->mux_nids = stac927x_mux_nids;
|
||||
spec->num_muxes = 3;
|
||||
|
||||
spec->init = stac927x_core_init;
|
||||
spec->mixer = stac927x_mixer;
|
||||
|
||||
spec->multiout.dac_nids = spec->dac_nids;
|
||||
|
||||
err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
|
||||
if (err < 0) {
|
||||
stac92xx_free(codec);
|
||||
return err;
|
||||
|
@ -1018,5 +1152,15 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = {
|
|||
{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
|
||||
{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
|
||||
{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
|
||||
{ .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
|
||||
{ .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
|
||||
{ .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
|
||||
{ .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
|
||||
{ .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
|
||||
{ .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
|
||||
{ .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
|
||||
{ .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
|
||||
{ .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
|
||||
{ .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
|
||||
{} /* terminator */
|
||||
};
|
||||
|
|
|
@ -427,6 +427,7 @@ static struct pci_device_id snd_intel8x0_ids[] = {
|
|||
{ 0x10de, 0x008a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8 */
|
||||
{ 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */
|
||||
{ 0x10de, 0x00ea, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8S */
|
||||
{ 0x10de, 0x026b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP51 */
|
||||
{ 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */
|
||||
{ 0x1022, 0x7445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */
|
||||
{ 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */
|
||||
|
@ -1803,6 +1804,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
|||
.name = "Dell", /* which model? AD1981B*/
|
||||
.type = AC97_TUNE_HP_ONLY
|
||||
},
|
||||
{
|
||||
.subvendor = 0x1028,
|
||||
.subdevice = 0x0151,
|
||||
.name = "Dell Optiplex GX270", /* AD1981B */
|
||||
.type = AC97_TUNE_HP_ONLY
|
||||
},
|
||||
{
|
||||
.subvendor = 0x1028,
|
||||
.subdevice = 0x0163,
|
||||
|
@ -1845,12 +1852,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
|||
.name = "HP nx8220",
|
||||
.type = AC97_TUNE_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x099c,
|
||||
.name = "HP nx6110", /* AD1981B */
|
||||
.type = AC97_TUNE_HP_ONLY
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x129d,
|
||||
|
@ -1866,7 +1867,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
|||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x099c,
|
||||
.name = "HP nc6120",
|
||||
.name = "HP nx6110/nc6120",
|
||||
.type = AC97_TUNE_HP_MUTE_LED
|
||||
},
|
||||
{
|
||||
|
|
|
@ -454,7 +454,7 @@ static int pcxhr_update_r_buffer(struct pcxhr_stream *stream)
|
|||
is_capture = (subs->stream == SNDRV_PCM_STREAM_CAPTURE);
|
||||
stream_num = is_capture ? 0 : subs->number;
|
||||
|
||||
snd_printdd("pcxhr_update_r_buffer(pcm%c%d) : addr(%p) bytes(%x) subs(%d)\n",
|
||||
snd_printdd("pcxhr_update_r_buffer(pcm%c%d) : addr(%p) bytes(%zx) subs(%d)\n",
|
||||
is_capture ? 'c' : 'p',
|
||||
chip->chip_idx, (void*)subs->runtime->dma_addr,
|
||||
subs->runtime->dma_bytes, subs->number);
|
||||
|
@ -744,13 +744,14 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs)
|
|||
/* only the first stream can choose the sample rate */
|
||||
/* the further opened streams will be limited to its frequency (see open) */
|
||||
/* set the clock only once (first stream) */
|
||||
if (mgr->sample_rate == 0) {
|
||||
if (mgr->sample_rate != subs->runtime->rate) {
|
||||
err = pcxhr_set_clock(mgr, subs->runtime->rate);
|
||||
if (err)
|
||||
break;
|
||||
if (mgr->sample_rate == 0)
|
||||
/* start the DSP-timer */
|
||||
err = pcxhr_hardware_timer(mgr, 1);
|
||||
mgr->sample_rate = subs->runtime->rate;
|
||||
|
||||
err = pcxhr_hardware_timer(mgr, 1); /* start the DSP-timer */
|
||||
}
|
||||
} while(0); /* do only once (so we can use break instead of goto) */
|
||||
|
||||
|
|
|
@ -3324,11 +3324,11 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
|
|||
snd_dma_pci_data(hdspm->pci),
|
||||
wanted,
|
||||
wanted)) < 0) {
|
||||
snd_printdd("Could not preallocate %d Bytes\n", wanted);
|
||||
snd_printdd("Could not preallocate %zd Bytes\n", wanted);
|
||||
|
||||
return err;
|
||||
} else
|
||||
snd_printdd(" Preallocated %d Bytes\n", wanted);
|
||||
snd_printdd(" Preallocated %zd Bytes\n", wanted);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3510,7 +3510,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
|
|||
|
||||
hdspm->monitor_outs = enable_monitor;
|
||||
|
||||
snd_printdd("kmalloc Mixer memory of %d Bytes\n",
|
||||
snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
|
||||
sizeof(struct hdspm_mixer));
|
||||
if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL))
|
||||
== NULL) {
|
||||
|
|
|
@ -64,9 +64,11 @@ module_param_array(wavetable_size, int, NULL, 0444);
|
|||
MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
|
||||
|
||||
static struct pci_device_id snd_trident_ids[] = {
|
||||
{ 0x1023, 0x2000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave DX PCI Audio */
|
||||
{ 0x1023, 0x2001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave NX PCI Audio */
|
||||
{ 0x1039, 0x7018, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* SiS SI7018 PCI Audio */
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX),
|
||||
PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX),
|
||||
0, 0, 0},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, 0},
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
@ -2340,6 +2340,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
|
|||
{ .subvendor = 0x1043, .subdevice = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/
|
||||
{ .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */
|
||||
{ .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */
|
||||
{ .subvendor = 0x1043, .subdevice = 0x8174, .action = VIA_DXS_SRC }, /* ASUS */
|
||||
{ .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */
|
||||
{ .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */
|
||||
{ .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
|
||||
|
@ -2358,6 +2359,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
|
|||
{ .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */
|
||||
{ .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */
|
||||
{ .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */
|
||||
{ .subvendor = 0x1462, .subdevice = 0xb012, .action = VIA_DXS_SRC }, /* P4M800/VIA8237R */
|
||||
{ .subvendor = 0x147b, .subdevice = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */
|
||||
{ .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */
|
||||
{ .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */
|
||||
|
@ -2371,6 +2373,9 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
|
|||
{ .subvendor = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */
|
||||
{ .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */
|
||||
{ .subvendor = 0x1695, .subdevice = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */
|
||||
{ .subvendor = 0x1695, .subdevice = 0x300e, .action = VIA_DXS_SRC }, /* EPoX 9HEAI */
|
||||
{ .subvendor = 0x16f3, .subdevice = 0x6405, .action = VIA_DXS_SRC }, /* Jetway K8M8MS */
|
||||
{ .subvendor = 0x1734, .subdevice = 0x1093, .action = VIA_DXS_SRC }, /* FSC */
|
||||
{ .subvendor = 0x1849, .subdevice = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */
|
||||
{ .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */
|
||||
{ .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */
|
||||
|
|
|
@ -1229,6 +1229,7 @@ static int snd_ymfpci_spdif_default_get(struct snd_kcontrol *kcontrol,
|
|||
spin_lock_irq(&chip->reg_lock);
|
||||
ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff;
|
||||
ucontrol->value.iec958.status[1] = (chip->spdif_bits >> 8) & 0xff;
|
||||
ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000;
|
||||
spin_unlock_irq(&chip->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1303,6 +1304,7 @@ static int snd_ymfpci_spdif_stream_get(struct snd_kcontrol *kcontrol,
|
|||
spin_lock_irq(&chip->reg_lock);
|
||||
ucontrol->value.iec958.status[0] = (chip->spdif_pcm_bits >> 0) & 0xff;
|
||||
ucontrol->value.iec958.status[1] = (chip->spdif_pcm_bits >> 8) & 0xff;
|
||||
ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000;
|
||||
spin_unlock_irq(&chip->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -478,22 +478,38 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs,
|
|||
/*
|
||||
* Prepare urb for streaming before playback starts.
|
||||
*
|
||||
* We don't care about (or have) any data, so we just send a transfer delimiter.
|
||||
* We don't yet have data, so we send a frame of silence.
|
||||
*/
|
||||
static int prepare_startup_playback_urb(struct snd_usb_substream *subs,
|
||||
struct snd_pcm_runtime *runtime,
|
||||
struct urb *urb)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int i, offs, counts;
|
||||
struct snd_urb_ctx *ctx = urb->context;
|
||||
int stride = runtime->frame_bits >> 3;
|
||||
|
||||
offs = 0;
|
||||
urb->dev = ctx->subs->dev;
|
||||
urb->number_of_packets = subs->packs_per_ms;
|
||||
for (i = 0; i < subs->packs_per_ms; ++i) {
|
||||
urb->iso_frame_desc[i].offset = 0;
|
||||
urb->iso_frame_desc[i].length = 0;
|
||||
/* calculate the size of a packet */
|
||||
if (subs->fill_max)
|
||||
counts = subs->maxframesize; /* fixed */
|
||||
else {
|
||||
subs->phase = (subs->phase & 0xffff)
|
||||
+ (subs->freqm << subs->datainterval);
|
||||
counts = subs->phase >> 16;
|
||||
if (counts > subs->maxframesize)
|
||||
counts = subs->maxframesize;
|
||||
}
|
||||
urb->iso_frame_desc[i].offset = offs * stride;
|
||||
urb->iso_frame_desc[i].length = counts * stride;
|
||||
offs += counts;
|
||||
}
|
||||
urb->transfer_buffer_length = 0;
|
||||
urb->transfer_buffer_length = offs * stride;
|
||||
memset(urb->transfer_buffer,
|
||||
subs->cur_audiofmt->format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0,
|
||||
offs * stride);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2477,12 +2493,13 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp
|
|||
if (err < 0)
|
||||
return err;
|
||||
#if 1
|
||||
/* FIXME: temporary hack for extigy/audigy 2 nx */
|
||||
/* FIXME: temporary hack for extigy/audigy 2 nx/zs */
|
||||
/* extigy apparently supports sample rates other than 48k
|
||||
* but not in ordinary way. so we enable only 48k atm.
|
||||
*/
|
||||
if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
|
||||
chip->usb_id == USB_ID(0x041e, 0x3020)) {
|
||||
chip->usb_id == USB_ID(0x041e, 0x3020) ||
|
||||
chip->usb_id == USB_ID(0x041e, 0x3061)) {
|
||||
if (fmt[3] == USB_FORMAT_TYPE_I &&
|
||||
fp->rates != SNDRV_PCM_RATE_48000 &&
|
||||
fp->rates != SNDRV_PCM_RATE_96000)
|
||||
|
|
Загрузка…
Ссылка в новой задаче