提交 b4103333 编写于 作者: L Linus Torvalds
...@@ -837,8 +837,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -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. Module for AC'97 motherboards from Intel and compatibles.
* Intel i810/810E, i815, i820, i830, i84x, MX440 * Intel i810/810E, i815, i820, i830, i84x, MX440
ICH5, ICH6, ICH7, ESB2
* SiS 7012 (SiS 735) * SiS 7012 (SiS 735)
* NVidia NForce, NForce2 * NVidia NForce, NForce2, NForce3, MCP04, CK804
CK8, CK8S, MCP501
* AMD AMD768, AMD8111 * AMD AMD768, AMD8111
* ALi m5455 * ALi m5455
...@@ -868,6 +870,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -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. 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) ac97_clock - AC'97 codec clock base (0 = auto-detect)
......
...@@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime { ...@@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime {
You need to pass the <function>snd_dma_pci_data(pci)</function>, You need to pass the <function>snd_dma_pci_data(pci)</function>,
where pci is the struct <structname>pci_dev</structname> pointer where pci is the struct <structname>pci_dev</structname> pointer
of the chip as well. 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-&gt;dma_private. You can cast substream-&gt;dma_private. You can cast
the pointer like: the pointer like:
<informalexample> <informalexample>
<programlisting> <programlisting>
<![CDATA[ <![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> </programlisting>
</informalexample> </informalexample>
......
...@@ -363,7 +363,7 @@ static int card_resume(struct pnp_dev *dev) ...@@ -363,7 +363,7 @@ static int card_resume(struct pnp_dev *dev)
int pnp_register_card_driver(struct pnp_card_driver * drv) int pnp_register_card_driver(struct pnp_card_driver * drv)
{ {
int count = 0; int count;
struct list_head *pos, *temp; struct list_head *pos, *temp;
drv->link.name = drv->name; drv->link.name = drv->name;
...@@ -374,10 +374,15 @@ int pnp_register_card_driver(struct pnp_card_driver * drv) ...@@ -374,10 +374,15 @@ int pnp_register_card_driver(struct pnp_card_driver * drv)
drv->link.suspend = drv->suspend ? card_suspend : NULL; drv->link.suspend = drv->suspend ? card_suspend : NULL;
drv->link.resume = drv->resume ? card_resume : NULL; drv->link.resume = drv->resume ? card_resume : NULL;
count = pnp_register_driver(&drv->link);
if (count < 0)
return count;
spin_lock(&pnp_lock); spin_lock(&pnp_lock);
list_add_tail(&drv->global_list, &pnp_card_drivers); list_add_tail(&drv->global_list, &pnp_card_drivers);
spin_unlock(&pnp_lock); spin_unlock(&pnp_lock);
pnp_register_driver(&drv->link);
count = 0;
list_for_each_safe(pos,temp,&pnp_cards){ list_for_each_safe(pos,temp,&pnp_cards){
struct pnp_card *card = list_entry(pos, struct pnp_card, global_list); 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) ...@@ -444,8 +444,8 @@ static unsigned int snd_info_entry_poll(struct file *file, poll_table * wait)
return mask; return mask;
} }
static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file, static long snd_info_entry_ioctl(struct file *file, unsigned int cmd,
unsigned int cmd, unsigned long arg) unsigned long arg)
{ {
struct snd_info_private_data *data; struct snd_info_private_data *data;
struct snd_info_entry *entry; struct snd_info_entry *entry;
...@@ -465,17 +465,6 @@ static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file, ...@@ -465,17 +465,6 @@ static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file,
return -ENOTTY; 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) static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
{ {
struct inode *inode = file->f_dentry->d_inode; 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) ...@@ -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 = static struct file_operations snd_info_entry_operations =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.llseek = snd_info_entry_llseek, .llseek = snd_info_entry_llseek,
.read = snd_info_entry_read, .read = snd_info_entry_read,
.write = snd_info_entry_write, .write = snd_info_entry_write,
.poll = snd_info_entry_poll, .poll = snd_info_entry_poll,
.ioctl = snd_info_entry_ioctl, .unlocked_ioctl = snd_info_entry_ioctl,
.mmap = snd_info_entry_mmap, .mmap = snd_info_entry_mmap,
.open = snd_info_entry_open, .open = snd_info_entry_open,
.release = snd_info_entry_release, .release = snd_info_entry_release,
}; };
/** /**
......
...@@ -789,7 +789,7 @@ static int __init snd_uart16550_create(struct snd_card *card, ...@@ -789,7 +789,7 @@ static int __init snd_uart16550_create(struct snd_card *card,
if ((err = snd_uart16550_detect(uart)) <= 0) { if ((err = snd_uart16550_detect(uart)) <= 0) {
printk(KERN_ERR "no UART detected at 0x%lx\n", iobase); printk(KERN_ERR "no UART detected at 0x%lx\n", iobase);
return err; return -ENODEV;
} }
if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { if (irq >= 0 && irq != SNDRV_AUTO_IRQ) {
......
...@@ -109,7 +109,9 @@ module_param_array(wssdma, int, NULL, 0444); ...@@ -109,7 +109,9 @@ module_param_array(wssdma, int, NULL, 0444);
MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver."); MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
static struct platform_device *platform_devices[SNDRV_CARDS]; static struct platform_device *platform_devices[SNDRV_CARDS];
#ifdef CONFIG_PNP
static int pnp_registered; static int pnp_registered;
#endif
#define CMI8330_RMUX3D 16 #define CMI8330_RMUX3D 16
#define CMI8330_MUTEMUX 17 #define CMI8330_MUTEMUX 17
...@@ -672,8 +674,10 @@ static void __init_or_module snd_cmi8330_unregister_all(void) ...@@ -672,8 +674,10 @@ static void __init_or_module snd_cmi8330_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnp_registered) if (pnp_registered)
pnp_unregister_card_driver(&cmi8330_pnpc_driver); pnp_unregister_card_driver(&cmi8330_pnpc_driver);
#endif
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&snd_cmi8330_driver); platform_driver_unregister(&snd_cmi8330_driver);
...@@ -700,11 +704,13 @@ static int __init alsa_card_cmi8330_init(void) ...@@ -700,11 +704,13 @@ static int __init alsa_card_cmi8330_init(void)
cards++; cards++;
} }
#ifdef CONFIG_PNP
err = pnp_register_card_driver(&cmi8330_pnpc_driver); err = pnp_register_card_driver(&cmi8330_pnpc_driver);
if (err >= 0) { if (err >= 0) {
pnp_registered = 1; pnp_registered = 1;
cards += err; cards += err;
} }
#endif
if (!cards) { if (!cards) {
#ifdef MODULE #ifdef MODULE
......
...@@ -75,8 +75,10 @@ MODULE_SUPPORTED_DEVICE("{{Crystal Semiconductors,CS4235}," ...@@ -75,8 +75,10 @@ MODULE_SUPPORTED_DEVICE("{{Crystal Semiconductors,CS4235},"
#ifdef CS4232 #ifdef CS4232
#define IDENT "CS4232" #define IDENT "CS4232"
#define CS423X_DRIVER "snd_cs4232"
#else #else
#define IDENT "CS4236+" #define IDENT "CS4236+"
#define CS423X_DRIVER "snd_cs4236"
#endif #endif
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
...@@ -125,10 +127,12 @@ module_param_array(dma2, int, NULL, 0444); ...@@ -125,10 +127,12 @@ module_param_array(dma2, int, NULL, 0444);
MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver."); MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver.");
static struct platform_device *platform_devices[SNDRV_CARDS]; static struct platform_device *platform_devices[SNDRV_CARDS];
#ifdef CONFIG_PNP
static int pnpc_registered; static int pnpc_registered;
#ifdef CS4232 #ifdef CS4232
static int pnp_registered; static int pnp_registered;
#endif #endif
#endif /* CONFIG_PNP */
struct snd_card_cs4236 { struct snd_card_cs4236 {
struct snd_cs4231 *chip; struct snd_cs4231 *chip;
...@@ -158,7 +162,6 @@ MODULE_DEVICE_TABLE(pnp, snd_cs4232_pnpbiosids); ...@@ -158,7 +162,6 @@ MODULE_DEVICE_TABLE(pnp, snd_cs4232_pnpbiosids);
#endif /* CS4232 */ #endif /* CS4232 */
#ifdef CS4232 #ifdef CS4232
#define CS423X_DRIVER "snd_cs4232"
#define CS423X_ISAPNP_DRIVER "cs4232_isapnp" #define CS423X_ISAPNP_DRIVER "cs4232_isapnp"
static struct pnp_card_device_id snd_cs423x_pnpids[] = { static struct pnp_card_device_id snd_cs423x_pnpids[] = {
/* Philips PCA70PS */ /* Philips PCA70PS */
...@@ -175,11 +178,12 @@ static struct pnp_card_device_id snd_cs423x_pnpids[] = { ...@@ -175,11 +178,12 @@ static struct pnp_card_device_id snd_cs423x_pnpids[] = {
{ .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } }, { .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } },
/* SIC CrystalWave 32 (CS4232) */ /* SIC CrystalWave 32 (CS4232) */
{ .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } }, { .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
/* Netfinity 3000 on-board soundcard */
{ .id = "CSCe825", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC010f" } } },
/* --- */ /* --- */
{ .id = "" } /* end */ { .id = "" } /* end */
}; };
#else /* CS4236 */ #else /* CS4236 */
#define CS423X_DRIVER "snd_cs4236"
#define CS423X_ISAPNP_DRIVER "cs4236_isapnp" #define CS423X_ISAPNP_DRIVER "cs4236_isapnp"
static struct pnp_card_device_id snd_cs423x_pnpids[] = { static struct pnp_card_device_id snd_cs423x_pnpids[] = {
/* Intel Marlin Spike Motherboard - CS4235 */ /* Intel Marlin Spike Motherboard - CS4235 */
...@@ -747,12 +751,14 @@ static void __init_or_module snd_cs423x_unregister_all(void) ...@@ -747,12 +751,14 @@ static void __init_or_module snd_cs423x_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnpc_registered) if (pnpc_registered)
pnp_unregister_card_driver(&cs423x_pnpc_driver); pnp_unregister_card_driver(&cs423x_pnpc_driver);
#ifdef CS4232 #ifdef CS4232
if (pnp_registered) if (pnp_registered)
pnp_unregister_driver(&cs4232_pnp_driver); pnp_unregister_driver(&cs4232_pnp_driver);
#endif #endif
#endif /* CONFIG_PNP */
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&cs423x_nonpnp_driver); platform_driver_unregister(&cs423x_nonpnp_driver);
...@@ -778,6 +784,7 @@ static int __init alsa_card_cs423x_init(void) ...@@ -778,6 +784,7 @@ static int __init alsa_card_cs423x_init(void)
platform_devices[i] = device; platform_devices[i] = device;
cards++; cards++;
} }
#ifdef CONFIG_PNP
#ifdef CS4232 #ifdef CS4232
i = pnp_register_driver(&cs4232_pnp_driver); i = pnp_register_driver(&cs4232_pnp_driver);
if (i >= 0) { if (i >= 0) {
...@@ -790,6 +797,8 @@ static int __init alsa_card_cs423x_init(void) ...@@ -790,6 +797,8 @@ static int __init alsa_card_cs423x_init(void)
pnpc_registered = 1; pnpc_registered = 1;
cards += i; cards += i;
} }
#endif /* CONFIG_PNP */
if (!cards) { if (!cards) {
#ifdef MODULE #ifdef MODULE
printk(KERN_ERR IDENT " soundcard not found or device busy\n"); printk(KERN_ERR IDENT " soundcard not found or device busy\n");
......
...@@ -1878,9 +1878,9 @@ module_param_array(dma2, int, NULL, 0444); ...@@ -1878,9 +1878,9 @@ module_param_array(dma2, int, NULL, 0444);
MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver."); MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver.");
static struct platform_device *platform_devices[SNDRV_CARDS]; static struct platform_device *platform_devices[SNDRV_CARDS];
static int pnp_registered;
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
static int pnp_registered;
static struct pnp_card_device_id snd_audiodrive_pnpids[] = { static struct pnp_card_device_id snd_audiodrive_pnpids[] = {
/* ESS 1868 (integrated on Compaq dual P-Pro motherboard and Genius 18PnP 3D) */ /* 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) ...@@ -2209,8 +2209,10 @@ static void __init_or_module snd_es18xx_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnp_registered) if (pnp_registered)
pnp_unregister_card_driver(&es18xx_pnpc_driver); pnp_unregister_card_driver(&es18xx_pnpc_driver);
#endif
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&snd_es18xx_nonpnp_driver); platform_driver_unregister(&snd_es18xx_nonpnp_driver);
...@@ -2237,11 +2239,13 @@ static int __init alsa_card_es18xx_init(void) ...@@ -2237,11 +2239,13 @@ static int __init alsa_card_es18xx_init(void)
cards++; cards++;
} }
#ifdef CONFIG_PNP
i = pnp_register_card_driver(&es18xx_pnpc_driver); i = pnp_register_card_driver(&es18xx_pnpc_driver);
if (i >= 0) { if (i >= 0) {
pnp_registered = 1; pnp_registered = 1;
cards += i; cards += i;
} }
#endif
if(!cards) { if(!cards) {
#ifdef MODULE #ifdef MODULE
......
...@@ -195,7 +195,7 @@ static int __init snd_gusclassic_probe(struct platform_device *pdev) ...@@ -195,7 +195,7 @@ static int __init snd_gusclassic_probe(struct platform_device *pdev)
goto _err; goto _err;
} }
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1); 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); sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
snd_card_set_dev(card, &pdev->dev); snd_card_set_dev(card, &pdev->dev);
......
...@@ -91,8 +91,10 @@ module_param_array(opl3sa3_ymode, int, NULL, 0444); ...@@ -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."); 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]; static struct platform_device *platform_devices[SNDRV_CARDS];
#ifdef CONFIG_PNP
static int pnp_registered; static int pnp_registered;
static int pnpc_registered; static int pnpc_registered;
#endif
/* control ports */ /* control ports */
#define OPL3SA2_PM_CTRL 0x01 #define OPL3SA2_PM_CTRL 0x01
...@@ -721,7 +723,7 @@ static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev) ...@@ -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", sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
card->shortname, chip->port, xirq, xdma1); card->shortname, chip->port, xirq, xdma1);
if (dma2 >= 0) if (xdma2 >= 0)
sprintf(card->longname + strlen(card->longname), "&%d", xdma2); sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
return snd_card_register(card); return snd_card_register(card);
...@@ -779,7 +781,7 @@ static int snd_opl3sa2_pnp_resume(struct pnp_dev *pdev) ...@@ -779,7 +781,7 @@ static int snd_opl3sa2_pnp_resume(struct pnp_dev *pdev)
#endif #endif
static struct pnp_driver opl3sa2_pnp_driver = { static struct pnp_driver opl3sa2_pnp_driver = {
.name = "opl3sa2-pnpbios", .name = "snd-opl3sa2-pnpbios",
.id_table = snd_opl3sa2_pnpbiosids, .id_table = snd_opl3sa2_pnpbiosids,
.probe = snd_opl3sa2_pnp_detect, .probe = snd_opl3sa2_pnp_detect,
.remove = __devexit_p(snd_opl3sa2_pnp_remove), .remove = __devexit_p(snd_opl3sa2_pnp_remove),
...@@ -846,7 +848,7 @@ static int snd_opl3sa2_pnp_cresume(struct pnp_card_link *pcard) ...@@ -846,7 +848,7 @@ static int snd_opl3sa2_pnp_cresume(struct pnp_card_link *pcard)
static struct pnp_card_driver opl3sa2_pnpc_driver = { static struct pnp_card_driver opl3sa2_pnpc_driver = {
.flags = PNP_DRIVER_RES_DISABLE, .flags = PNP_DRIVER_RES_DISABLE,
.name = "opl3sa2", .name = "snd-opl3sa2-cpnp",
.id_table = snd_opl3sa2_pnpids, .id_table = snd_opl3sa2_pnpids,
.probe = snd_opl3sa2_pnp_cdetect, .probe = snd_opl3sa2_pnp_cdetect,
.remove = __devexit_p(snd_opl3sa2_pnp_cremove), .remove = __devexit_p(snd_opl3sa2_pnp_cremove),
...@@ -929,10 +931,12 @@ static void __init_or_module snd_opl3sa2_unregister_all(void) ...@@ -929,10 +931,12 @@ static void __init_or_module snd_opl3sa2_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnpc_registered) if (pnpc_registered)
pnp_unregister_card_driver(&opl3sa2_pnpc_driver); pnp_unregister_card_driver(&opl3sa2_pnpc_driver);
if (pnp_registered) if (pnp_registered)
pnp_unregister_driver(&opl3sa2_pnp_driver); pnp_unregister_driver(&opl3sa2_pnp_driver);
#endif
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); platform_driver_unregister(&snd_opl3sa2_nonpnp_driver);
...@@ -961,6 +965,7 @@ static int __init alsa_card_opl3sa2_init(void) ...@@ -961,6 +965,7 @@ static int __init alsa_card_opl3sa2_init(void)
cards++; cards++;
} }
#ifdef CONFIG_PNP
err = pnp_register_driver(&opl3sa2_pnp_driver); err = pnp_register_driver(&opl3sa2_pnp_driver);
if (err >= 0) { if (err >= 0) {
pnp_registered = 1; pnp_registered = 1;
...@@ -971,6 +976,7 @@ static int __init alsa_card_opl3sa2_init(void) ...@@ -971,6 +976,7 @@ static int __init alsa_card_opl3sa2_init(void)
pnpc_registered = 1; pnpc_registered = 1;
cards += err; cards += err;
} }
#endif
if (!cards) { if (!cards) {
#ifdef MODULE #ifdef MODULE
......
...@@ -1349,7 +1349,7 @@ static int snd_opti93x_pcm(struct snd_opti93x *codec, int device, struct snd_pcm ...@@ -1349,7 +1349,7 @@ static int snd_opti93x_pcm(struct snd_opti93x *codec, int device, struct snd_pcm
int error; int error;
struct snd_pcm *pcm; 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; return error;
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_opti93x_playback_ops); 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[] = { ...@@ -179,6 +179,8 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
{ .id = "CTL0086", .devs = { { "CTL0041" } } }, { .id = "CTL0086", .devs = { { "CTL0041" } } },
/* Sound Blaster Vibra16X */ /* Sound Blaster Vibra16X */
{ .id = "CTL00f0", .devs = { { "CTL0043" } } }, { .id = "CTL00f0", .devs = { { "CTL0043" } } },
/* Sound Blaster 16 (Virtual PC 2004) */
{ .id = "tBA03b0", .devs = { {.id="PNPb003" } } },
#else /* SNDRV_SBAWE defined */ #else /* SNDRV_SBAWE defined */
/* Sound Blaster AWE 32 PnP */ /* Sound Blaster AWE 32 PnP */
{ .id = "CTL0035", .devs = { { "CTL0031" }, { "CTL0021" } } }, { .id = "CTL0035", .devs = { { "CTL0031" }, { "CTL0021" } } },
...@@ -235,8 +237,6 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = { ...@@ -235,8 +237,6 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
{ .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } }, { .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } },
{ .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } }, { .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } },
#endif /* SNDRV_SBAWE */ #endif /* SNDRV_SBAWE */
/* Sound Blaster 16 PnP (Virtual PC 2004)*/
{ .id = "tBA03b0", .devs = { { "PNPb003" } } },
{ .id = "", } { .id = "", }
}; };
......
...@@ -69,9 +69,9 @@ module_param_array(dma, int, NULL, 0444); ...@@ -69,9 +69,9 @@ module_param_array(dma, int, NULL, 0444);
MODULE_PARM_DESC(dma, "DMA # for SoundScape driver."); MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
static struct platform_device *platform_devices[SNDRV_CARDS]; static struct platform_device *platform_devices[SNDRV_CARDS];
static int pnp_registered;
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
static int pnp_registered;
static struct pnp_card_device_id sscape_pnpids[] = { static struct pnp_card_device_id sscape_pnpids[] = {
{ .id = "ENS3081", .devs = { { "ENS0000" } } }, { .id = "ENS3081", .devs = { { "ENS0000" } } },
{ .id = "" } /* end */ { .id = "" } /* end */
...@@ -1391,8 +1391,10 @@ static void __init_or_module sscape_unregister_all(void) ...@@ -1391,8 +1391,10 @@ static void __init_or_module sscape_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnp_registered) if (pnp_registered)
pnp_unregister_card_driver(&sscape_pnpc_driver); pnp_unregister_card_driver(&sscape_pnpc_driver);
#endif
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&snd_sscape_driver); platform_driver_unregister(&snd_sscape_driver);
...@@ -1466,8 +1468,10 @@ static int __init sscape_init(void) ...@@ -1466,8 +1468,10 @@ static int __init sscape_init(void)
ret = sscape_manual_probe(); ret = sscape_manual_probe();
if (ret < 0) if (ret < 0)
return ret; return ret;
#ifdef CONFIG_PNP
if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0) if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0)
pnp_registered = 1; pnp_registered = 1;
#endif
return 0; return 0;
} }
......
...@@ -84,10 +84,9 @@ module_param_array(use_cs4232_midi, bool, NULL, 0444); ...@@ -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)"); 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 struct platform_device *platform_devices[SNDRV_CARDS];
static int pnp_registered;
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
static int pnp_registered;
static struct pnp_card_device_id snd_wavefront_pnpids[] = { static struct pnp_card_device_id snd_wavefront_pnpids[] = {
/* Tropez */ /* Tropez */
...@@ -695,8 +694,10 @@ static void __init_or_module snd_wavefront_unregister_all(void) ...@@ -695,8 +694,10 @@ static void __init_or_module snd_wavefront_unregister_all(void)
{ {
int i; int i;
#ifdef CONFIG_PNP
if (pnp_registered) if (pnp_registered)
pnp_unregister_card_driver(&wavefront_pnpc_driver); pnp_unregister_card_driver(&wavefront_pnpc_driver);
#endif
for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
platform_device_unregister(platform_devices[i]); platform_device_unregister(platform_devices[i]);
platform_driver_unregister(&snd_wavefront_driver); platform_driver_unregister(&snd_wavefront_driver);
...@@ -725,11 +726,13 @@ static int __init alsa_card_wavefront_init(void) ...@@ -725,11 +726,13 @@ static int __init alsa_card_wavefront_init(void)
cards++; cards++;
} }
#ifdef CONFIG_PNP
i = pnp_register_card_driver(&wavefront_pnpc_driver); i = pnp_register_card_driver(&wavefront_pnpc_driver);
if (i >= 0) { if (i >= 0) {
pnp_registered = 1; pnp_registered = 1;
cards += i; cards += i;
} }
#endif
if (!cards) { if (!cards) {
#ifdef MODULE #ifdef MODULE
......
...@@ -866,7 +866,7 @@ wavefront_send_sample (snd_wavefront_t *dev, ...@@ -866,7 +866,7 @@ wavefront_send_sample (snd_wavefront_t *dev,
divided by 2. divided by 2.
*/ */
u16 sample_short; u16 sample_short = 0;
u32 length; u32 length;
u16 __user *data_end = NULL; u16 __user *data_end = NULL;
unsigned int i; unsigned int i;
......
...@@ -1621,8 +1621,27 @@ static const struct snd_kcontrol_new snd_ac97_ad1981x_jack_sense[] = { ...@@ -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), 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) 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, return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
ARRAY_SIZE(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 = { ...@@ -1635,22 +1654,26 @@ static struct snd_ac97_build_ops patch_ad1981a_build_ops = {
#endif #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) static void check_ad1981_hp_jack_sense(struct snd_ac97 *ac97)
{ {
u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device; if (check_list(ac97, ad1981_jacks_whitelist))
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 */
/* enable headphone jack sense */ /* enable headphone jack sense */
snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11); snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11);
break;
}
} }
int patch_ad1981a(struct snd_ac97 *ac97) int patch_ad1981a(struct snd_ac97 *ac97)
...@@ -1672,6 +1695,8 @@ static int patch_ad1981b_specific(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) if ((err = patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1)) < 0)
return err; return err;
if (check_list(ac97, ad1981_jacks_blacklist))
return 0;
return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense, return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
ARRAY_SIZE(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) ...@@ -2210,9 +2235,9 @@ static void alc850_update_jacks(struct snd_ac97 *ac97)
/* Vref disable (bit12), 1kOhm (bit13) */ /* Vref disable (bit12), 1kOhm (bit13) */
snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13), snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13),
shared ? (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, 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[] = { static const struct snd_kcontrol_new snd_ac97_controls_alc850[] = {
......
...@@ -279,7 +279,7 @@ struct snd_ali { ...@@ -279,7 +279,7 @@ struct snd_ali {
}; };
static struct pci_device_id snd_ali_ids[] = { 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, } {0, }
}; };
MODULE_DEVICE_TABLE(pci, snd_ali_ids); MODULE_DEVICE_TABLE(pci, snd_ali_ids);
......
...@@ -849,7 +849,7 @@ static int ...@@ -849,7 +849,7 @@ static int
snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
vortex_t *vortex = snd_kcontrol_chip(kcontrol); vortex_t *vortex = snd_kcontrol_chip(kcontrol);
int i, count; int i, count = 0;
u16 peaks[20]; u16 peaks[20];
vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count); vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count);
......
...@@ -781,6 +781,8 @@ static struct pci_device_id snd_bt87x_ids[] = { ...@@ -781,6 +781,8 @@ static struct pci_device_id snd_bt87x_ids[] = {
BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000), BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000),
/* Viewcast Osprey 200 */ /* Viewcast Osprey 200 */
BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100), 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); MODULE_DEVICE_TABLE(pci, snd_bt87x_ids);
...@@ -808,7 +810,7 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci) ...@@ -808,7 +810,7 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
const struct pci_device_id *supported; const struct pci_device_id *supported;
supported = pci_match_device(&driver, pci); supported = pci_match_device(&driver, pci);
if (supported) if (supported && supported->driver_data > 0)
return supported->driver_data; return supported->driver_data;
for (i = 0; i < ARRAY_SIZE(blacklist); ++i) for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
......
...@@ -199,7 +199,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = { ...@@ -199,7 +199,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
.name = "MSI K8N Diamond MB [SB0438]", .name = "MSI K8N Diamond MB [SB0438]",
.gpio_type = 1, .gpio_type = 1,
.i2c_adc = 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". * high-definition 7.1 audio processor".
* Added using info from andrewvegan in alsa bug #1298 * Added using info from andrewvegan in alsa bug #1298
*/ */
...@@ -207,6 +208,15 @@ static struct snd_ca0106_details ca0106_chip_details[] = { ...@@ -207,6 +208,15 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
.name = "Shuttle XPC SD31P [SD31P]", .name = "Shuttle XPC SD31P [SD31P]",
.gpio_type = 1, .gpio_type = 1,
.i2c_adc = 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, { .serial = 0,
.name = "AudigyLS [Unknown]" } .name = "AudigyLS [Unknown]" }
}; };
......
...@@ -675,7 +675,7 @@ cs46xx_dsp_create_src_task_scb(struct snd_cs46xx * chip, char * scb_name, ...@@ -675,7 +675,7 @@ cs46xx_dsp_create_src_task_scb(struct snd_cs46xx * chip, char * scb_name,
if (pass_through) { if (pass_through) {
/* wont work with any other rate than /* wont work with any other rate than
the native DSP rate */ 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, scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb,
dest,"DMAREADER",parent_scb, dest,"DMAREADER",parent_scb,
......
...@@ -46,8 +46,10 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; ...@@ -46,8 +46,10 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
static struct pci_device_id snd_cs5535audio_ids[] = { static struct pci_device_id snd_cs5535audio_ids[] = {
{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO, PCI_ANY_ID, { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO,
PCI_ANY_ID, 0, 0, 0, }, 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, ...@@ -759,6 +759,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
"Master Mono Playback Volume", "Master Mono Playback Volume",
"PCM Out Path & Mute", "PCM Out Path & Mute",
"Mono Output Select", "Mono Output Select",
"Front Playback Switch",
"Front Playback Volume",
"Surround Playback Switch", "Surround Playback Switch",
"Surround Playback Volume", "Surround Playback Volume",
"Center Playback Switch", "Center Playback Switch",
...@@ -829,9 +831,9 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, ...@@ -829,9 +831,9 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
} }
if (emu->audigy) { if (emu->audigy) {
/* set master volume to 0 dB */ /* 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 */ /* 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; c = audigy_remove_ctls;
} else { } else {
/* /*
...@@ -844,8 +846,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, ...@@ -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); snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
} }
/* remove unused AC97 controls */ /* remove unused AC97 controls */
snd_ac97_write(emu->ac97, AC97_SURROUND_MASTER, 0x0202); snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
snd_ac97_write(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202); snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
c = emu10k1_remove_ctls; c = emu10k1_remove_ctls;
} }
for (; *c; c++) for (; *c; c++)
......
...@@ -75,6 +75,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," ...@@ -75,6 +75,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
"{Intel, ICH6M}," "{Intel, ICH6M},"
"{Intel, ICH7}," "{Intel, ICH7},"
"{Intel, ESB2}," "{Intel, ESB2},"
"{Intel, ICH8},"
"{ATI, SB450}," "{ATI, SB450},"
"{VIA, VT8251}," "{VIA, VT8251},"
"{VIA, VT8237A}," "{VIA, VT8237A},"
...@@ -1586,6 +1587,7 @@ static struct pci_device_id azx_ids[] = { ...@@ -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, 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, 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, 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 */ { 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 */ { 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 */ { 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[] = { ...@@ -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 = 0x8196, .config = ALC880_6ST }, /* ASUS P5GD1-HVM */
{ .pci_subvendor = 0x1043, .pci_subdevice = 0x81b4, .config = ALC880_6ST }, { .pci_subvendor = 0x1043, .pci_subdevice = 0x81b4, .config = ALC880_6ST },
{ .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_6ST }, /* Acer APFV */ { .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 }, { .modelname = "6stack-digout", .config = ALC880_6ST_DIG },
{ .pci_subvendor = 0x2668, .pci_subdevice = 0x8086, .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[] = { ...@@ -2475,7 +2476,7 @@ static struct hda_verb alc260_init_verbs[] = {
/* LINE-2 is used for line-out in rear */ /* LINE-2 is used for line-out in rear */
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
/* select line-out */ /* select line-out */
{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
/* LINE-OUT pin */ /* LINE-OUT pin */
{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
/* enable HP */ /* enable HP */
...@@ -2945,6 +2946,8 @@ static int alc260_auto_init(struct hda_codec *codec) ...@@ -2945,6 +2946,8 @@ static int alc260_auto_init(struct hda_codec *codec)
*/ */
static struct hda_board_config alc260_cfg_tbl[] = { static struct hda_board_config alc260_cfg_tbl[] = {
{ .modelname = "basic", .config = ALC260_BASIC }, { .modelname = "basic", .config = ALC260_BASIC },
{ .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb,
.config = ALC260_BASIC }, /* Sony VAIO */
{ .modelname = "hp", .config = ALC260_HP }, { .modelname = "hp", .config = ALC260_HP },
{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP }, { .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP },
{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP }, { .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP },
...@@ -3414,12 +3417,12 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = { ...@@ -3414,12 +3417,12 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = {
* configuration and preset * configuration and preset
*/ */
static struct hda_board_config alc882_cfg_tbl[] = { static struct hda_board_config alc882_cfg_tbl[] = {
{ .modelname = "3stack-dig", .config = ALC861_3ST_DIG }, { .modelname = "3stack-dig", .config = ALC882_3ST_DIG },
{ .modelname = "6stack-dig", .config = ALC861_6ST_DIG }, { .modelname = "6stack-dig", .config = ALC882_6ST_DIG },
{ .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */ { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */
{ .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */ { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */
{ .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* ECS */ { .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) ...@@ -297,6 +297,7 @@ static int patch_si3054(struct hda_codec *codec)
struct hda_codec_preset snd_hda_preset_si3054[] = { struct hda_codec_preset snd_hda_preset_si3054[] = {
{ .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 }, { .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 },
{ .id = 0x163c3155, .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 { ...@@ -50,10 +50,11 @@ struct sigmatel_spec {
unsigned int surr_switch: 1; unsigned int surr_switch: 1;
unsigned int line_switch: 1; unsigned int line_switch: 1;
unsigned int mic_switch: 1; unsigned int mic_switch: 1;
unsigned int alt_switch: 1;
/* playback */ /* playback */
struct hda_multi_out multiout; struct hda_multi_out multiout;
hda_nid_t dac_nids[4]; hda_nid_t dac_nids[5];
/* capture */ /* capture */
hda_nid_t *adc_nids; hda_nid_t *adc_nids;
...@@ -73,7 +74,7 @@ struct sigmatel_spec { ...@@ -73,7 +74,7 @@ struct sigmatel_spec {
/* capture source */ /* capture source */
struct hda_input_mux *input_mux; struct hda_input_mux *input_mux;
unsigned int cur_mux[2]; unsigned int cur_mux[3];
/* i/o switches */ /* i/o switches */
unsigned int io_switch[2]; unsigned int io_switch[2];
...@@ -107,6 +108,14 @@ static hda_nid_t stac922x_mux_nids[2] = { ...@@ -107,6 +108,14 @@ static hda_nid_t stac922x_mux_nids[2] = {
0x12, 0x13, 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] = { static hda_nid_t stac9200_pin_nids[8] = {
0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
}; };
...@@ -116,6 +125,12 @@ static hda_nid_t stac922x_pin_nids[10] = { ...@@ -116,6 +125,12 @@ static hda_nid_t stac922x_pin_nids[10] = {
0x0f, 0x10, 0x11, 0x15, 0x1b, 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) static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
...@@ -155,6 +170,12 @@ static struct hda_verb stac922x_core_init[] = { ...@@ -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[] = { static struct snd_kcontrol_new stac9200_mixer[] = {
HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
HDA_CODEC_MUTE("Master Playback Switch", 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[] = { ...@@ -183,10 +204,26 @@ static struct snd_kcontrol_new stac922x_mixer[] = {
.put = stac92xx_mux_enum_put, .put = stac92xx_mux_enum_put,
}, },
HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_INPUT), 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), HDA_CODEC_VOLUME("Mux Capture Volume", 0x12, 0x0, HDA_OUTPUT),
{ } /* end */ { } /* 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) static int stac92xx_build_controls(struct hda_codec *codec)
{ {
struct sigmatel_spec *spec = codec->spec; struct sigmatel_spec *spec = codec->spec;
...@@ -240,14 +277,14 @@ static unsigned int ref922x_pin_configs[10] = { ...@@ -240,14 +277,14 @@ static unsigned int ref922x_pin_configs[10] = {
}; };
static unsigned int d945gtp3_pin_configs[10] = { static unsigned int d945gtp3_pin_configs[10] = {
0x0221401f, 0x01a19022, 0x01813021, 0x01114010, 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
0x40000100, 0x40000100, 0x40000100, 0x40000100, 0x40000100, 0x40000100, 0x40000100, 0x40000100,
0x02a19120, 0x40000100, 0x02a19120, 0x40000100,
}; };
static unsigned int d945gtp5_pin_configs[10] = { static unsigned int d945gtp5_pin_configs[10] = {
0x0221401f, 0x01111012, 0x01813024, 0x01114010, 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
0x01a19021, 0x01116011, 0x01452130, 0x40000100, 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
0x02a19320, 0x40000100, 0x02a19320, 0x40000100,
}; };
...@@ -274,6 +311,28 @@ static struct hda_board_config stac922x_cfg_tbl[] = { ...@@ -274,6 +311,28 @@ static struct hda_board_config stac922x_cfg_tbl[] = {
{ .pci_subvendor = PCI_VENDOR_ID_INTEL, { .pci_subvendor = PCI_VENDOR_ID_INTEL,
.pci_subdevice = 0x0013, .pci_subdevice = 0x0013,
.config = STAC_D945GTP5 }, /* Intel D955XBK - 5 Stack */ .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 */ {} /* terminator */
}; };
...@@ -408,11 +467,23 @@ static struct hda_pcm_stream stac92xx_pcm_analog_playback = { ...@@ -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 = { static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
.substreams = 2, .substreams = 2,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.nid = 0x06, /* NID to query formats and rates */ /* NID is set in stac92xx_build_pcms */
.ops = { .ops = {
.prepare = stac92xx_capture_pcm_prepare, .prepare = stac92xx_capture_pcm_prepare,
.cleanup = stac92xx_capture_pcm_cleanup .cleanup = stac92xx_capture_pcm_cleanup
...@@ -430,6 +501,14 @@ static int stac92xx_build_pcms(struct hda_codec *codec) ...@@ -430,6 +501,14 @@ static int stac92xx_build_pcms(struct hda_codec *codec)
info->name = "STAC92xx Analog"; info->name = "STAC92xx Analog";
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback; 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] = 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) { if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
codec->num_pcms++; codec->num_pcms++;
...@@ -588,6 +667,16 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf ...@@ -588,6 +667,16 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
return 0; 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 */ /* 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) 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 ...@@ -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; 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; return 0;
} }
...@@ -753,19 +848,21 @@ static void stac92xx_auto_init_hp_out(struct hda_codec *codec) ...@@ -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); 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; struct sigmatel_spec *spec = codec->spec;
int err; int err;
if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0) if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
return err; 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) if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
return err; return err;
if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
return err; 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 || if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
(err = stac92xx_auto_create_hp_ctls(codec, &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) ...@@ -777,11 +874,11 @@ static int stac922x_parse_auto_config(struct hda_codec *codec)
spec->surr_switch = 1; spec->surr_switch = 1;
if (spec->autocfg.dig_out_pin) { 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); stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN);
} }
if (spec->autocfg.dig_in_pin) { 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); 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) ...@@ -827,9 +924,6 @@ static int stac92xx_init(struct hda_codec *codec)
snd_hda_sequence_write(codec, spec->init); snd_hda_sequence_write(codec, spec->init);
stac92xx_auto_init_multi_out(codec);
stac92xx_auto_init_hp_out(codec);
return 0; return 0;
} }
...@@ -996,7 +1090,47 @@ static int patch_stac922x(struct hda_codec *codec) ...@@ -996,7 +1090,47 @@ static int patch_stac922x(struct hda_codec *codec)
spec->multiout.dac_nids = spec->dac_nids; 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) { if (err < 0) {
stac92xx_free(codec); stac92xx_free(codec);
return err; return err;
...@@ -1018,5 +1152,15 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = { ...@@ -1018,5 +1152,15 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = {
{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x }, { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x }, { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
{ .id = 0x83847683, .name = "STAC9221D 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 */ {} /* terminator */
}; };
...@@ -427,6 +427,7 @@ static struct pci_device_id snd_intel8x0_ids[] = { ...@@ -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, 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, 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, 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, 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 */ { 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 */ { 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */
...@@ -1803,6 +1804,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1803,6 +1804,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
.name = "Dell", /* which model? AD1981B*/ .name = "Dell", /* which model? AD1981B*/
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{
.subvendor = 0x1028,
.subdevice = 0x0151,
.name = "Dell Optiplex GX270", /* AD1981B */
.type = AC97_TUNE_HP_ONLY
},
{ {
.subvendor = 0x1028, .subvendor = 0x1028,
.subdevice = 0x0163, .subdevice = 0x0163,
...@@ -1845,12 +1852,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1845,12 +1852,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
.name = "HP nx8220", .name = "HP nx8220",
.type = AC97_TUNE_MUTE_LED .type = AC97_TUNE_MUTE_LED
}, },
{
.subvendor = 0x103c,
.subdevice = 0x099c,
.name = "HP nx6110", /* AD1981B */
.type = AC97_TUNE_HP_ONLY
},
{ {
.subvendor = 0x103c, .subvendor = 0x103c,
.subdevice = 0x129d, .subdevice = 0x129d,
...@@ -1866,7 +1867,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1866,7 +1867,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{ {
.subvendor = 0x103c, .subvendor = 0x103c,
.subdevice = 0x099c, .subdevice = 0x099c,
.name = "HP nc6120", .name = "HP nx6110/nc6120",
.type = AC97_TUNE_HP_MUTE_LED .type = AC97_TUNE_HP_MUTE_LED
}, },
{ {
......
...@@ -454,7 +454,7 @@ static int pcxhr_update_r_buffer(struct pcxhr_stream *stream) ...@@ -454,7 +454,7 @@ static int pcxhr_update_r_buffer(struct pcxhr_stream *stream)
is_capture = (subs->stream == SNDRV_PCM_STREAM_CAPTURE); is_capture = (subs->stream == SNDRV_PCM_STREAM_CAPTURE);
stream_num = is_capture ? 0 : subs->number; 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', is_capture ? 'c' : 'p',
chip->chip_idx, (void*)subs->runtime->dma_addr, chip->chip_idx, (void*)subs->runtime->dma_addr,
subs->runtime->dma_bytes, subs->number); subs->runtime->dma_bytes, subs->number);
...@@ -744,13 +744,14 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs) ...@@ -744,13 +744,14 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs)
/* only the first stream can choose the sample rate */ /* only the first stream can choose the sample rate */
/* the further opened streams will be limited to its frequency (see open) */ /* the further opened streams will be limited to its frequency (see open) */
/* set the clock only once (first stream) */ /* 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); err = pcxhr_set_clock(mgr, subs->runtime->rate);
if (err) if (err)
break; break;
if (mgr->sample_rate == 0)
/* start the DSP-timer */
err = pcxhr_hardware_timer(mgr, 1);
mgr->sample_rate = subs->runtime->rate; 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) */ } 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) ...@@ -3324,11 +3324,11 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
snd_dma_pci_data(hdspm->pci), snd_dma_pci_data(hdspm->pci),
wanted, wanted,
wanted)) < 0) { wanted)) < 0) {
snd_printdd("Could not preallocate %d Bytes\n", wanted); snd_printdd("Could not preallocate %zd Bytes\n", wanted);
return err; return err;
} else } else
snd_printdd(" Preallocated %d Bytes\n", wanted); snd_printdd(" Preallocated %zd Bytes\n", wanted);
return 0; return 0;
} }
...@@ -3510,7 +3510,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp ...@@ -3510,7 +3510,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
hdspm->monitor_outs = enable_monitor; 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)); sizeof(struct hdspm_mixer));
if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL)) if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL))
== NULL) { == NULL) {
......
...@@ -64,9 +64,11 @@ module_param_array(wavetable_size, int, NULL, 0444); ...@@ -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."); MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
static struct pci_device_id snd_trident_ids[] = { static struct pci_device_id snd_trident_ids[] = {
{ 0x1023, 0x2000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave DX PCI Audio */ {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX),
{ 0x1023, 0x2001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave NX PCI Audio */ PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0},
{ 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_NX),
0, 0, 0},
{PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, 0},
{ 0, } { 0, }
}; };
......
...@@ -2340,6 +2340,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci) ...@@ -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 = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/
{ .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */ { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */
{ .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */ { .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 = 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 = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */
{ .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */ { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
...@@ -2358,6 +2359,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci) ...@@ -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 = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */
{ .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */ { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */
{ .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */ { .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 = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */
{ .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */ { .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */
{ .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */ { .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) ...@@ -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 = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */
{ .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */ { .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 = 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 = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */
{ .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */ { .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */
{ .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */ { .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, ...@@ -1229,6 +1229,7 @@ static int snd_ymfpci_spdif_default_get(struct snd_kcontrol *kcontrol,
spin_lock_irq(&chip->reg_lock); spin_lock_irq(&chip->reg_lock);
ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff; ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff;
ucontrol->value.iec958.status[1] = (chip->spdif_bits >> 8) & 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); spin_unlock_irq(&chip->reg_lock);
return 0; return 0;
} }
...@@ -1303,6 +1304,7 @@ static int snd_ymfpci_spdif_stream_get(struct snd_kcontrol *kcontrol, ...@@ -1303,6 +1304,7 @@ static int snd_ymfpci_spdif_stream_get(struct snd_kcontrol *kcontrol,
spin_lock_irq(&chip->reg_lock); spin_lock_irq(&chip->reg_lock);
ucontrol->value.iec958.status[0] = (chip->spdif_pcm_bits >> 0) & 0xff; 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[1] = (chip->spdif_pcm_bits >> 8) & 0xff;
ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000;
spin_unlock_irq(&chip->reg_lock); spin_unlock_irq(&chip->reg_lock);
return 0; return 0;
} }
......
...@@ -478,22 +478,38 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs, ...@@ -478,22 +478,38 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs,
/* /*
* Prepare urb for streaming before playback starts. * 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, static int prepare_startup_playback_urb(struct snd_usb_substream *subs,
struct snd_pcm_runtime *runtime, struct snd_pcm_runtime *runtime,
struct urb *urb) struct urb *urb)
{ {
unsigned int i; unsigned int i, offs, counts;
struct snd_urb_ctx *ctx = urb->context; struct snd_urb_ctx *ctx = urb->context;
int stride = runtime->frame_bits >> 3;
offs = 0;
urb->dev = ctx->subs->dev; urb->dev = ctx->subs->dev;
urb->number_of_packets = subs->packs_per_ms; urb->number_of_packets = subs->packs_per_ms;
for (i = 0; i < subs->packs_per_ms; ++i) { for (i = 0; i < subs->packs_per_ms; ++i) {
urb->iso_frame_desc[i].offset = 0; /* calculate the size of a packet */
urb->iso_frame_desc[i].length = 0; 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; return 0;
} }
...@@ -2477,12 +2493,13 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp ...@@ -2477,12 +2493,13 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp
if (err < 0) if (err < 0)
return err; return err;
#if 1 #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 /* extigy apparently supports sample rates other than 48k
* but not in ordinary way. so we enable only 48k atm. * but not in ordinary way. so we enable only 48k atm.
*/ */
if (chip->usb_id == USB_ID(0x041e, 0x3000) || 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 && if (fmt[3] == USB_FORMAT_TYPE_I &&
fp->rates != SNDRV_PCM_RATE_48000 && fp->rates != SNDRV_PCM_RATE_48000 &&
fp->rates != SNDRV_PCM_RATE_96000) fp->rates != SNDRV_PCM_RATE_96000)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册