diff options
Diffstat (limited to 'sound/pci')
101 files changed, 5271 insertions, 2436 deletions
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index 6e3a1848447c..93422e3a3f0c 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
@@ -400,6 +400,26 @@ config SND_INDIGODJ | |||
400 | To compile this driver as a module, choose M here: the module | 400 | To compile this driver as a module, choose M here: the module |
401 | will be called snd-indigodj | 401 | will be called snd-indigodj |
402 | 402 | ||
403 | config SND_INDIGOIOX | ||
404 | tristate "(Echoaudio) Indigo IOx" | ||
405 | select FW_LOADER | ||
406 | select SND_PCM | ||
407 | help | ||
408 | Say 'Y' or 'M' to include support for Echoaudio Indigo IOx. | ||
409 | |||
410 | To compile this driver as a module, choose M here: the module | ||
411 | will be called snd-indigoiox | ||
412 | |||
413 | config SND_INDIGODJX | ||
414 | tristate "(Echoaudio) Indigo DJx" | ||
415 | select FW_LOADER | ||
416 | select SND_PCM | ||
417 | help | ||
418 | Say 'Y' or 'M' to include support for Echoaudio Indigo DJx. | ||
419 | |||
420 | To compile this driver as a module, choose M here: the module | ||
421 | will be called snd-indigodjx | ||
422 | |||
403 | config SND_EMU10K1 | 423 | config SND_EMU10K1 |
404 | tristate "Emu10k1 (SB Live!, Audigy, E-mu APS)" | 424 | tristate "Emu10k1 (SB Live!, Audigy, E-mu APS)" |
405 | select FW_LOADER | 425 | select FW_LOADER |
@@ -487,7 +507,7 @@ config SND_FM801 | |||
487 | config SND_FM801_TEA575X_BOOL | 507 | config SND_FM801_TEA575X_BOOL |
488 | bool "ForteMedia FM801 + TEA5757 tuner" | 508 | bool "ForteMedia FM801 + TEA5757 tuner" |
489 | depends on SND_FM801 | 509 | depends on SND_FM801 |
490 | depends on VIDEO_V4L1=y || VIDEO_V4L1=SND_FM801 | 510 | depends on VIDEO_V4L2=y || VIDEO_V4L2=SND_FM801 |
491 | help | 511 | help |
492 | Say Y here to include support for soundcards based on the ForteMedia | 512 | Say Y here to include support for soundcards based on the ForteMedia |
493 | FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media | 513 | FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media |
@@ -744,8 +764,9 @@ config SND_VIRTUOSO | |||
744 | select SND_OXYGEN_LIB | 764 | select SND_OXYGEN_LIB |
745 | help | 765 | help |
746 | Say Y here to include support for sound cards based on the | 766 | Say Y here to include support for sound cards based on the |
747 | Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X and | 767 | Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X, and |
748 | HDAV1.3 (Deluxe). | 768 | Essence STX. |
769 | Support for the HDAV1.3 (Deluxe) is very experimental. | ||
749 | 770 | ||
750 | To compile this driver as a module, choose M here: the module | 771 | To compile this driver as a module, choose M here: the module |
751 | will be called snd-virtuoso. | 772 | will be called snd-virtuoso. |
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index e2b843b4f9d0..78288dbfc17a 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -143,6 +143,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { | |||
143 | { 0x43525970, 0xfffffff8, "CS4202", NULL, NULL }, | 143 | { 0x43525970, 0xfffffff8, "CS4202", NULL, NULL }, |
144 | { 0x43585421, 0xffffffff, "HSD11246", NULL, NULL }, // SmartMC II | 144 | { 0x43585421, 0xffffffff, "HSD11246", NULL, NULL }, // SmartMC II |
145 | { 0x43585428, 0xfffffff8, "Cx20468", patch_conexant, NULL }, // SmartAMC fixme: the mask might be different | 145 | { 0x43585428, 0xfffffff8, "Cx20468", patch_conexant, NULL }, // SmartAMC fixme: the mask might be different |
146 | { 0x43585430, 0xffffffff, "Cx20468-31", patch_conexant, NULL }, | ||
146 | { 0x43585431, 0xffffffff, "Cx20551", patch_cx20551, NULL }, | 147 | { 0x43585431, 0xffffffff, "Cx20551", patch_cx20551, NULL }, |
147 | { 0x44543031, 0xfffffff0, "DT0398", NULL, NULL }, | 148 | { 0x44543031, 0xfffffff0, "DT0398", NULL, NULL }, |
148 | { 0x454d4328, 0xffffffff, "EM28028", NULL, NULL }, // same as TR28028? | 149 | { 0x454d4328, 0xffffffff, "EM28028", NULL, NULL }, // same as TR28028? |
@@ -383,7 +384,7 @@ int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned sho | |||
383 | 384 | ||
384 | EXPORT_SYMBOL(snd_ac97_update_bits); | 385 | EXPORT_SYMBOL(snd_ac97_update_bits); |
385 | 386 | ||
386 | /* no lock version - see snd_ac97_updat_bits() */ | 387 | /* no lock version - see snd_ac97_update_bits() */ |
387 | int snd_ac97_update_bits_nolock(struct snd_ac97 *ac97, unsigned short reg, | 388 | int snd_ac97_update_bits_nolock(struct snd_ac97 *ac97, unsigned short reg, |
388 | unsigned short mask, unsigned short value) | 389 | unsigned short mask, unsigned short value) |
389 | { | 390 | { |
@@ -1643,7 +1644,10 @@ static int snd_ac97_modem_build(struct snd_card *card, struct snd_ac97 * ac97) | |||
1643 | { | 1644 | { |
1644 | int err, idx; | 1645 | int err, idx; |
1645 | 1646 | ||
1646 | //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG)); | 1647 | /* |
1648 | printk(KERN_DEBUG "AC97_GPIO_CFG = %x\n", | ||
1649 | snd_ac97_read(ac97,AC97_GPIO_CFG)); | ||
1650 | */ | ||
1647 | snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH)); | 1651 | snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH)); |
1648 | snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH)); | 1652 | snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH)); |
1649 | snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff); | 1653 | snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff); |
@@ -2118,7 +2122,7 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, | |||
2118 | } | 2122 | } |
2119 | /* nothing should be in powerdown mode */ | 2123 | /* nothing should be in powerdown mode */ |
2120 | snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0); | 2124 | snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0); |
2121 | end_time = jiffies + msecs_to_jiffies(100); | 2125 | end_time = jiffies + msecs_to_jiffies(120); |
2122 | do { | 2126 | do { |
2123 | if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f) | 2127 | if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f) |
2124 | goto __ready_ok; | 2128 | goto __ready_ok; |
diff --git a/sound/pci/ac97/ac97_proc.c b/sound/pci/ac97/ac97_proc.c index 060ea59d5f02..73b17d526c8b 100644 --- a/sound/pci/ac97/ac97_proc.c +++ b/sound/pci/ac97/ac97_proc.c | |||
@@ -125,6 +125,8 @@ static void snd_ac97_proc_read_main(struct snd_ac97 *ac97, struct snd_info_buffe | |||
125 | snd_iprintf(buffer, "PCI Subsys Device: 0x%04x\n\n", | 125 | snd_iprintf(buffer, "PCI Subsys Device: 0x%04x\n\n", |
126 | ac97->subsystem_device); | 126 | ac97->subsystem_device); |
127 | 127 | ||
128 | snd_iprintf(buffer, "Flags: %x\n", ac97->flags); | ||
129 | |||
128 | if ((ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23) { | 130 | if ((ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23) { |
129 | val = snd_ac97_read(ac97, AC97_INT_PAGING); | 131 | val = snd_ac97_read(ac97, AC97_INT_PAGING); |
130 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, | 132 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, |
diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index d1f242bd0ac5..8f5098f92c37 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c | |||
@@ -909,8 +909,8 @@ snd_ad1889_create(struct snd_card *card, | |||
909 | return err; | 909 | return err; |
910 | 910 | ||
911 | /* check PCI availability (32bit DMA) */ | 911 | /* check PCI availability (32bit DMA) */ |
912 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || | 912 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 || |
913 | pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 913 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
914 | printk(KERN_ERR PFX "error setting 32-bit DMA mask.\n"); | 914 | printk(KERN_ERR PFX "error setting 32-bit DMA mask.\n"); |
915 | pci_disable_device(pci); | 915 | pci_disable_device(pci); |
916 | return -ENXIO; | 916 | return -ENXIO; |
diff --git a/sound/pci/ak4531_codec.c b/sound/pci/ak4531_codec.c index 0f819ddb3ebf..fd135e3d8a84 100644 --- a/sound/pci/ak4531_codec.c +++ b/sound/pci/ak4531_codec.c | |||
@@ -51,7 +51,8 @@ static void snd_ak4531_dump(struct snd_ak4531 *ak4531) | |||
51 | int idx; | 51 | int idx; |
52 | 52 | ||
53 | for (idx = 0; idx < 0x19; idx++) | 53 | for (idx = 0; idx < 0x19; idx++) |
54 | printk("ak4531 0x%x: 0x%x\n", idx, ak4531->regs[idx]); | 54 | printk(KERN_DEBUG "ak4531 0x%x: 0x%x\n", |
55 | idx, ak4531->regs[idx]); | ||
55 | } | 56 | } |
56 | 57 | ||
57 | #endif | 58 | #endif |
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index b36c551da566..c551006e2920 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
@@ -2142,7 +2142,7 @@ static int __devinit snd_ali_resources(struct snd_ali *codec) | |||
2142 | { | 2142 | { |
2143 | int err; | 2143 | int err; |
2144 | 2144 | ||
2145 | snd_ali_printk("resouces allocation ...\n"); | 2145 | snd_ali_printk("resources allocation ...\n"); |
2146 | err = pci_request_regions(codec->pci, "ALI 5451"); | 2146 | err = pci_request_regions(codec->pci, "ALI 5451"); |
2147 | if (err < 0) | 2147 | if (err < 0) |
2148 | return err; | 2148 | return err; |
@@ -2154,7 +2154,7 @@ static int __devinit snd_ali_resources(struct snd_ali *codec) | |||
2154 | return -EBUSY; | 2154 | return -EBUSY; |
2155 | } | 2155 | } |
2156 | codec->irq = codec->pci->irq; | 2156 | codec->irq = codec->pci->irq; |
2157 | snd_ali_printk("resouces allocated.\n"); | 2157 | snd_ali_printk("resources allocated.\n"); |
2158 | return 0; | 2158 | return 0; |
2159 | } | 2159 | } |
2160 | static int snd_ali_dev_free(struct snd_device *device) | 2160 | static int snd_ali_dev_free(struct snd_device *device) |
@@ -2186,8 +2186,8 @@ static int __devinit snd_ali_create(struct snd_card *card, | |||
2186 | if (err < 0) | 2186 | if (err < 0) |
2187 | return err; | 2187 | return err; |
2188 | /* check, if we can restrict PCI DMA transfers to 31 bits */ | 2188 | /* check, if we can restrict PCI DMA transfers to 31 bits */ |
2189 | if (pci_set_dma_mask(pci, DMA_31BIT_MASK) < 0 || | 2189 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(31)) < 0 || |
2190 | pci_set_consistent_dma_mask(pci, DMA_31BIT_MASK) < 0) { | 2190 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(31)) < 0) { |
2191 | snd_printk(KERN_ERR "architecture does not support " | 2191 | snd_printk(KERN_ERR "architecture does not support " |
2192 | "31bit PCI busmaster DMA\n"); | 2192 | "31bit PCI busmaster DMA\n"); |
2193 | pci_disable_device(pci); | 2193 | pci_disable_device(pci); |
diff --git a/sound/pci/als300.c b/sound/pci/als300.c index f557c155db48..3aa35af7ca91 100644 --- a/sound/pci/als300.c +++ b/sound/pci/als300.c | |||
@@ -91,7 +91,7 @@ | |||
91 | #define DEBUG_PLAY_REC 0 | 91 | #define DEBUG_PLAY_REC 0 |
92 | 92 | ||
93 | #if DEBUG_CALLS | 93 | #if DEBUG_CALLS |
94 | #define snd_als300_dbgcalls(format, args...) printk(format, ##args) | 94 | #define snd_als300_dbgcalls(format, args...) printk(KERN_DEBUG format, ##args) |
95 | #define snd_als300_dbgcallenter() printk(KERN_ERR "--> %s\n", __func__) | 95 | #define snd_als300_dbgcallenter() printk(KERN_ERR "--> %s\n", __func__) |
96 | #define snd_als300_dbgcallleave() printk(KERN_ERR "<-- %s\n", __func__) | 96 | #define snd_als300_dbgcallleave() printk(KERN_ERR "<-- %s\n", __func__) |
97 | #else | 97 | #else |
@@ -689,8 +689,8 @@ static int __devinit snd_als300_create(struct snd_card *card, | |||
689 | if ((err = pci_enable_device(pci)) < 0) | 689 | if ((err = pci_enable_device(pci)) < 0) |
690 | return err; | 690 | return err; |
691 | 691 | ||
692 | if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | 692 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 || |
693 | pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | 693 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { |
694 | printk(KERN_ERR "error setting 28bit DMA mask\n"); | 694 | printk(KERN_ERR "error setting 28bit DMA mask\n"); |
695 | pci_disable_device(pci); | 695 | pci_disable_device(pci); |
696 | return -ENXIO; | 696 | return -ENXIO; |
diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 542a0c65a92c..3dbacde1a5af 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c | |||
@@ -872,8 +872,8 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci, | |||
872 | return err; | 872 | return err; |
873 | } | 873 | } |
874 | /* check, if we can restrict PCI DMA transfers to 24 bits */ | 874 | /* check, if we can restrict PCI DMA transfers to 24 bits */ |
875 | if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || | 875 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 || |
876 | pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { | 876 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) { |
877 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); | 877 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); |
878 | pci_disable_device(pci); | 878 | pci_disable_device(pci); |
879 | return -ENXIO; | 879 | return -ENXIO; |
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 9ce8548c03e4..71515ddb4593 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c | |||
@@ -1393,6 +1393,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1393 | .name = "HP nx6125", | 1393 | .name = "HP nx6125", |
1394 | .type = AC97_TUNE_MUTE_LED | 1394 | .type = AC97_TUNE_MUTE_LED |
1395 | }, | 1395 | }, |
1396 | { | ||
1397 | .subvendor = 0x103c, | ||
1398 | .subdevice = 0x3091, | ||
1399 | .name = "unknown HP", | ||
1400 | .type = AC97_TUNE_MUTE_LED | ||
1401 | }, | ||
1396 | { } /* terminator */ | 1402 | { } /* terminator */ |
1397 | }; | 1403 | }; |
1398 | 1404 | ||
diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c index 9ec122383eef..7b72c88e449d 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c | |||
@@ -151,8 +151,8 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) | |||
151 | // check PCI availability (DMA). | 151 | // check PCI availability (DMA). |
152 | if ((err = pci_enable_device(pci)) < 0) | 152 | if ((err = pci_enable_device(pci)) < 0) |
153 | return err; | 153 | return err; |
154 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || | 154 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 || |
155 | pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 155 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
156 | printk(KERN_ERR "error to set DMA mask\n"); | 156 | printk(KERN_ERR "error to set DMA mask\n"); |
157 | pci_disable_device(pci); | 157 | pci_disable_device(pci); |
158 | return -ENXIO; | 158 | return -ENXIO; |
diff --git a/sound/pci/au88x0/au88x0_a3d.c b/sound/pci/au88x0/au88x0_a3d.c index 649849e540d3..f4aa8ff6f5f9 100644 --- a/sound/pci/au88x0/au88x0_a3d.c +++ b/sound/pci/au88x0/au88x0_a3d.c | |||
@@ -462,9 +462,10 @@ static void a3dsrc_ZeroSliceIO(a3dsrc_t * a) | |||
462 | /* Reset Single A3D source. */ | 462 | /* Reset Single A3D source. */ |
463 | static void a3dsrc_ZeroState(a3dsrc_t * a) | 463 | static void a3dsrc_ZeroState(a3dsrc_t * a) |
464 | { | 464 | { |
465 | 465 | /* | |
466 | //printk("vortex: ZeroState slice: %d, source %d\n", a->slice, a->source); | 466 | printk(KERN_DEBUG "vortex: ZeroState slice: %d, source %d\n", |
467 | 467 | a->slice, a->source); | |
468 | */ | ||
468 | a3dsrc_SetAtmosState(a, 0, 0, 0, 0); | 469 | a3dsrc_SetAtmosState(a, 0, 0, 0, 0); |
469 | a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros); | 470 | a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros); |
470 | a3dsrc_SetItdDline(a, A3dItdDlineZeros); | 471 | a3dsrc_SetItdDline(a, A3dItdDlineZeros); |
diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c index b070e5714514..3906f5afe27a 100644 --- a/sound/pci/au88x0/au88x0_core.c +++ b/sound/pci/au88x0/au88x0_core.c | |||
@@ -1135,7 +1135,10 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, | |||
1135 | snd_pcm_sgbuf_get_addr(dma->substream, 0)); | 1135 | snd_pcm_sgbuf_get_addr(dma->substream, 0)); |
1136 | break; | 1136 | break; |
1137 | } | 1137 | } |
1138 | //printk("vortex: cfg0 = 0x%x\nvortex: cfg1=0x%x\n", dma->cfg0, dma->cfg1); | 1138 | /* |
1139 | printk(KERN_DEBUG "vortex: cfg0 = 0x%x\nvortex: cfg1=0x%x\n", | ||
1140 | dma->cfg0, dma->cfg1); | ||
1141 | */ | ||
1139 | hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG0 + (adbdma << 3), dma->cfg0); | 1142 | hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG0 + (adbdma << 3), dma->cfg0); |
1140 | hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG1 + (adbdma << 3), dma->cfg1); | 1143 | hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG1 + (adbdma << 3), dma->cfg1); |
1141 | 1144 | ||
@@ -1959,7 +1962,7 @@ vortex_connect_codecplay(vortex_t * vortex, int en, unsigned char mixers[]) | |||
1959 | ADB_CODECOUT(0 + 4)); | 1962 | ADB_CODECOUT(0 + 4)); |
1960 | vortex_connection_mix_adb(vortex, en, 0x11, mixers[3], | 1963 | vortex_connection_mix_adb(vortex, en, 0x11, mixers[3], |
1961 | ADB_CODECOUT(1 + 4)); | 1964 | ADB_CODECOUT(1 + 4)); |
1962 | //printk("SDAC detected "); | 1965 | /* printk(KERN_DEBUG "SDAC detected "); */ |
1963 | } | 1966 | } |
1964 | #else | 1967 | #else |
1965 | // Use plain direct output to codec. | 1968 | // Use plain direct output to codec. |
@@ -2013,7 +2016,11 @@ vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype) | |||
2013 | resmap[restype] |= (1 << i); | 2016 | resmap[restype] |= (1 << i); |
2014 | else | 2017 | else |
2015 | vortex->dma_adb[i].resources[restype] |= (1 << i); | 2018 | vortex->dma_adb[i].resources[restype] |= (1 << i); |
2016 | //printk("vortex: ResManager: type %d out %d\n", restype, i); | 2019 | /* |
2020 | printk(KERN_DEBUG | ||
2021 | "vortex: ResManager: type %d out %d\n", | ||
2022 | restype, i); | ||
2023 | */ | ||
2017 | return i; | 2024 | return i; |
2018 | } | 2025 | } |
2019 | } | 2026 | } |
@@ -2024,7 +2031,11 @@ vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype) | |||
2024 | for (i = 0; i < qty; i++) { | 2031 | for (i = 0; i < qty; i++) { |
2025 | if (resmap[restype] & (1 << i)) { | 2032 | if (resmap[restype] & (1 << i)) { |
2026 | resmap[restype] &= ~(1 << i); | 2033 | resmap[restype] &= ~(1 << i); |
2027 | //printk("vortex: ResManager: type %d in %d\n",restype, i); | 2034 | /* |
2035 | printk(KERN_DEBUG | ||
2036 | "vortex: ResManager: type %d in %d\n", | ||
2037 | restype, i); | ||
2038 | */ | ||
2028 | return i; | 2039 | return i; |
2029 | } | 2040 | } |
2030 | } | 2041 | } |
@@ -2789,7 +2800,7 @@ vortex_translateformat(vortex_t * vortex, char bits, char nch, int encod) | |||
2789 | { | 2800 | { |
2790 | int a, this_194; | 2801 | int a, this_194; |
2791 | 2802 | ||
2792 | if ((bits != 8) || (bits != 16)) | 2803 | if ((bits != 8) && (bits != 16)) |
2793 | return -1; | 2804 | return -1; |
2794 | 2805 | ||
2795 | switch (encod) { | 2806 | switch (encod) { |
diff --git a/sound/pci/au88x0/au88x0_synth.c b/sound/pci/au88x0/au88x0_synth.c index 978b856f5621..2805e34bd41d 100644 --- a/sound/pci/au88x0/au88x0_synth.c +++ b/sound/pci/au88x0/au88x0_synth.c | |||
@@ -213,38 +213,59 @@ vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, | |||
213 | switch (reg) { | 213 | switch (reg) { |
214 | /* Voice specific parameters */ | 214 | /* Voice specific parameters */ |
215 | case 0: /* running */ | 215 | case 0: /* running */ |
216 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_RUN(wt), (int)val); | 216 | /* |
217 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
218 | WT_RUN(wt), (int)val); | ||
219 | */ | ||
217 | hwwrite(vortex->mmio, WT_RUN(wt), val); | 220 | hwwrite(vortex->mmio, WT_RUN(wt), val); |
218 | return 0xc; | 221 | return 0xc; |
219 | break; | 222 | break; |
220 | case 1: /* param 0 */ | 223 | case 1: /* param 0 */ |
221 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_PARM(wt,0), (int)val); | 224 | /* |
225 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
226 | WT_PARM(wt,0), (int)val); | ||
227 | */ | ||
222 | hwwrite(vortex->mmio, WT_PARM(wt, 0), val); | 228 | hwwrite(vortex->mmio, WT_PARM(wt, 0), val); |
223 | return 0xc; | 229 | return 0xc; |
224 | break; | 230 | break; |
225 | case 2: /* param 1 */ | 231 | case 2: /* param 1 */ |
226 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_PARM(wt,1), (int)val); | 232 | /* |
233 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
234 | WT_PARM(wt,1), (int)val); | ||
235 | */ | ||
227 | hwwrite(vortex->mmio, WT_PARM(wt, 1), val); | 236 | hwwrite(vortex->mmio, WT_PARM(wt, 1), val); |
228 | return 0xc; | 237 | return 0xc; |
229 | break; | 238 | break; |
230 | case 3: /* param 2 */ | 239 | case 3: /* param 2 */ |
231 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_PARM(wt,2), (int)val); | 240 | /* |
241 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
242 | WT_PARM(wt,2), (int)val); | ||
243 | */ | ||
232 | hwwrite(vortex->mmio, WT_PARM(wt, 2), val); | 244 | hwwrite(vortex->mmio, WT_PARM(wt, 2), val); |
233 | return 0xc; | 245 | return 0xc; |
234 | break; | 246 | break; |
235 | case 4: /* param 3 */ | 247 | case 4: /* param 3 */ |
236 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_PARM(wt,3), (int)val); | 248 | /* |
249 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
250 | WT_PARM(wt,3), (int)val); | ||
251 | */ | ||
237 | hwwrite(vortex->mmio, WT_PARM(wt, 3), val); | 252 | hwwrite(vortex->mmio, WT_PARM(wt, 3), val); |
238 | return 0xc; | 253 | return 0xc; |
239 | break; | 254 | break; |
240 | case 6: /* mute */ | 255 | case 6: /* mute */ |
241 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_MUTE(wt), (int)val); | 256 | /* |
257 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
258 | WT_MUTE(wt), (int)val); | ||
259 | */ | ||
242 | hwwrite(vortex->mmio, WT_MUTE(wt), val); | 260 | hwwrite(vortex->mmio, WT_MUTE(wt), val); |
243 | return 0xc; | 261 | return 0xc; |
244 | break; | 262 | break; |
245 | case 0xb: | 263 | case 0xb: |
246 | { /* delay */ | 264 | { /* delay */ |
247 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", WT_DELAY(wt,0), (int)val); | 265 | /* |
266 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", | ||
267 | WT_DELAY(wt,0), (int)val); | ||
268 | */ | ||
248 | hwwrite(vortex->mmio, WT_DELAY(wt, 3), val); | 269 | hwwrite(vortex->mmio, WT_DELAY(wt, 3), val); |
249 | hwwrite(vortex->mmio, WT_DELAY(wt, 2), val); | 270 | hwwrite(vortex->mmio, WT_DELAY(wt, 2), val); |
250 | hwwrite(vortex->mmio, WT_DELAY(wt, 1), val); | 271 | hwwrite(vortex->mmio, WT_DELAY(wt, 1), val); |
@@ -272,7 +293,9 @@ vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, | |||
272 | return 0; | 293 | return 0; |
273 | break; | 294 | break; |
274 | } | 295 | } |
275 | //printk("vortex: WT SetReg(0x%x) = 0x%08x\n", ecx, (int)val); | 296 | /* |
297 | printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", ecx, (int)val); | ||
298 | */ | ||
276 | hwwrite(vortex->mmio, ecx, val); | 299 | hwwrite(vortex->mmio, ecx, val); |
277 | return 1; | 300 | return 1; |
278 | } | 301 | } |
diff --git a/sound/pci/aw2/aw2-alsa.c b/sound/pci/aw2/aw2-alsa.c index eefcbf648ee1..4d34bb0d99d3 100644 --- a/sound/pci/aw2/aw2-alsa.c +++ b/sound/pci/aw2/aw2-alsa.c | |||
@@ -165,7 +165,7 @@ module_param_array(enable, bool, NULL, 0444); | |||
165 | MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard."); | 165 | MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard."); |
166 | 166 | ||
167 | static struct pci_device_id snd_aw2_ids[] = { | 167 | static struct pci_device_id snd_aw2_ids[] = { |
168 | {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, PCI_ANY_ID, PCI_ANY_ID, | 168 | {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, 0, 0, |
169 | 0, 0, 0}, | 169 | 0, 0, 0}, |
170 | {0} | 170 | {0} |
171 | }; | 171 | }; |
@@ -279,8 +279,8 @@ static int __devinit snd_aw2_create(struct snd_card *card, | |||
279 | pci_set_master(pci); | 279 | pci_set_master(pci); |
280 | 280 | ||
281 | /* check PCI availability (32bit DMA) */ | 281 | /* check PCI availability (32bit DMA) */ |
282 | if ((pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) || | 282 | if ((pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) || |
283 | (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0)) { | 283 | (pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0)) { |
284 | printk(KERN_ERR "aw2: Impossible to set 32bit mask DMA\n"); | 284 | printk(KERN_ERR "aw2: Impossible to set 32bit mask DMA\n"); |
285 | pci_disable_device(pci); | 285 | pci_disable_device(pci); |
286 | return -ENXIO; | 286 | return -ENXIO; |
diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 1df96e76c483..f290bc56178f 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c | |||
@@ -211,25 +211,25 @@ MODULE_SUPPORTED_DEVICE("{{Aztech,AZF3328}}"); | |||
211 | #endif | 211 | #endif |
212 | 212 | ||
213 | #if DEBUG_MIXER | 213 | #if DEBUG_MIXER |
214 | #define snd_azf3328_dbgmixer(format, args...) printk(format, ##args) | 214 | #define snd_azf3328_dbgmixer(format, args...) printk(KERN_DEBUG format, ##args) |
215 | #else | 215 | #else |
216 | #define snd_azf3328_dbgmixer(format, args...) | 216 | #define snd_azf3328_dbgmixer(format, args...) |
217 | #endif | 217 | #endif |
218 | 218 | ||
219 | #if DEBUG_PLAY_REC | 219 | #if DEBUG_PLAY_REC |
220 | #define snd_azf3328_dbgplay(format, args...) printk(KERN_ERR format, ##args) | 220 | #define snd_azf3328_dbgplay(format, args...) printk(KERN_DEBUG format, ##args) |
221 | #else | 221 | #else |
222 | #define snd_azf3328_dbgplay(format, args...) | 222 | #define snd_azf3328_dbgplay(format, args...) |
223 | #endif | 223 | #endif |
224 | 224 | ||
225 | #if DEBUG_MISC | 225 | #if DEBUG_MISC |
226 | #define snd_azf3328_dbgtimer(format, args...) printk(KERN_ERR format, ##args) | 226 | #define snd_azf3328_dbgtimer(format, args...) printk(KERN_DEBUG format, ##args) |
227 | #else | 227 | #else |
228 | #define snd_azf3328_dbgtimer(format, args...) | 228 | #define snd_azf3328_dbgtimer(format, args...) |
229 | #endif | 229 | #endif |
230 | 230 | ||
231 | #if DEBUG_GAME | 231 | #if DEBUG_GAME |
232 | #define snd_azf3328_dbggame(format, args...) printk(KERN_ERR format, ##args) | 232 | #define snd_azf3328_dbggame(format, args...) printk(KERN_DEBUG format, ##args) |
233 | #else | 233 | #else |
234 | #define snd_azf3328_dbggame(format, args...) | 234 | #define snd_azf3328_dbggame(format, args...) |
235 | #endif | 235 | #endif |
@@ -2125,8 +2125,8 @@ snd_azf3328_create(struct snd_card *card, | |||
2125 | chip->irq = -1; | 2125 | chip->irq = -1; |
2126 | 2126 | ||
2127 | /* check if we can restrict PCI DMA transfers to 24 bits */ | 2127 | /* check if we can restrict PCI DMA transfers to 24 bits */ |
2128 | if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || | 2128 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 || |
2129 | pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { | 2129 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) { |
2130 | snd_printk(KERN_ERR "architecture does not support " | 2130 | snd_printk(KERN_ERR "architecture does not support " |
2131 | "24bit PCI busmaster DMA\n" | 2131 | "24bit PCI busmaster DMA\n" |
2132 | ); | 2132 | ); |
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index a299340519df..ce3f2e90f4d7 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c | |||
@@ -349,7 +349,8 @@ static struct snd_pcm_hardware snd_bt87x_digital_hw = { | |||
349 | .info = SNDRV_PCM_INFO_MMAP | | 349 | .info = SNDRV_PCM_INFO_MMAP | |
350 | SNDRV_PCM_INFO_INTERLEAVED | | 350 | SNDRV_PCM_INFO_INTERLEAVED | |
351 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | 351 | SNDRV_PCM_INFO_BLOCK_TRANSFER | |
352 | SNDRV_PCM_INFO_MMAP_VALID, | 352 | SNDRV_PCM_INFO_MMAP_VALID | |
353 | SNDRV_PCM_INFO_BATCH, | ||
353 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 354 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
354 | .rates = 0, /* set at runtime */ | 355 | .rates = 0, /* set at runtime */ |
355 | .channels_min = 2, | 356 | .channels_min = 2, |
@@ -365,7 +366,8 @@ static struct snd_pcm_hardware snd_bt87x_analog_hw = { | |||
365 | .info = SNDRV_PCM_INFO_MMAP | | 366 | .info = SNDRV_PCM_INFO_MMAP | |
366 | SNDRV_PCM_INFO_INTERLEAVED | | 367 | SNDRV_PCM_INFO_INTERLEAVED | |
367 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | 368 | SNDRV_PCM_INFO_BLOCK_TRANSFER | |
368 | SNDRV_PCM_INFO_MMAP_VALID, | 369 | SNDRV_PCM_INFO_MMAP_VALID | |
370 | SNDRV_PCM_INFO_BATCH, | ||
369 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, | 371 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, |
370 | .rates = SNDRV_PCM_RATE_KNOT, | 372 | .rates = SNDRV_PCM_RATE_KNOT, |
371 | .rate_min = ANALOG_CLOCK / CLOCK_DIV_MAX, | 373 | .rate_min = ANALOG_CLOCK / CLOCK_DIV_MAX, |
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index b116456e7707..bfac30f7929f 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c | |||
@@ -255,6 +255,14 @@ static struct snd_ca0106_details ca0106_chip_details[] = { | |||
255 | .gpio_type = 2, | 255 | .gpio_type = 2, |
256 | .i2c_adc = 1, | 256 | .i2c_adc = 1, |
257 | .spi_dac = 1 } , | 257 | .spi_dac = 1 } , |
258 | /* Giga-byte GA-G1975X mobo | ||
259 | * Novell bnc#395807 | ||
260 | */ | ||
261 | /* FIXME: the GPIO and I2C setting aren't tested well */ | ||
262 | { .serial = 0x1458a006, | ||
263 | .name = "Giga-byte GA-G1975X", | ||
264 | .gpio_type = 1, | ||
265 | .i2c_adc = 1 }, | ||
258 | /* Shuttle XPC SD31P which has an onboard Creative Labs | 266 | /* Shuttle XPC SD31P which has an onboard Creative Labs |
259 | * Sound Blaster Live! 24-bit EAX | 267 | * Sound Blaster Live! 24-bit EAX |
260 | * high-definition 7.1 audio processor". | 268 | * high-definition 7.1 audio processor". |
@@ -404,7 +412,9 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu, | |||
404 | } | 412 | } |
405 | 413 | ||
406 | tmp = reg << 25 | value << 16; | 414 | tmp = reg << 25 | value << 16; |
407 | // snd_printk("I2C-write:reg=0x%x, value=0x%x\n", reg, value); | 415 | /* |
416 | snd_printk(KERN_DEBUG "I2C-write:reg=0x%x, value=0x%x\n", reg, value); | ||
417 | */ | ||
408 | /* Not sure what this I2C channel controls. */ | 418 | /* Not sure what this I2C channel controls. */ |
409 | /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */ | 419 | /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */ |
410 | 420 | ||
@@ -422,7 +432,7 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu, | |||
422 | /* Wait till the transaction ends */ | 432 | /* Wait till the transaction ends */ |
423 | while (1) { | 433 | while (1) { |
424 | status = snd_ca0106_ptr_read(emu, I2C_A, 0); | 434 | status = snd_ca0106_ptr_read(emu, I2C_A, 0); |
425 | //snd_printk("I2C:status=0x%x\n", status); | 435 | /*snd_printk(KERN_DEBUG "I2C:status=0x%x\n", status);*/ |
426 | timeout++; | 436 | timeout++; |
427 | if ((status & I2C_A_ADC_START) == 0) | 437 | if ((status & I2C_A_ADC_START) == 0) |
428 | break; | 438 | break; |
@@ -521,7 +531,10 @@ static int snd_ca0106_pcm_open_playback_channel(struct snd_pcm_substream *substr | |||
521 | channel->number = channel_id; | 531 | channel->number = channel_id; |
522 | 532 | ||
523 | channel->use = 1; | 533 | channel->use = 1; |
524 | //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); | 534 | /* |
535 | printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n", | ||
536 | channel_id, chip, channel); | ||
537 | */ | ||
525 | //channel->interrupt = snd_ca0106_pcm_channel_interrupt; | 538 | //channel->interrupt = snd_ca0106_pcm_channel_interrupt; |
526 | channel->epcm = epcm; | 539 | channel->epcm = epcm; |
527 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 540 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
@@ -614,7 +627,10 @@ static int snd_ca0106_pcm_open_capture_channel(struct snd_pcm_substream *substre | |||
614 | channel->number = channel_id; | 627 | channel->number = channel_id; |
615 | 628 | ||
616 | channel->use = 1; | 629 | channel->use = 1; |
617 | //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); | 630 | /* |
631 | printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n", | ||
632 | channel_id, chip, channel); | ||
633 | */ | ||
618 | //channel->interrupt = snd_ca0106_pcm_channel_interrupt; | 634 | //channel->interrupt = snd_ca0106_pcm_channel_interrupt; |
619 | channel->epcm = epcm; | 635 | channel->epcm = epcm; |
620 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 636 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
@@ -705,9 +721,20 @@ static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream) | |||
705 | u32 reg71; | 721 | u32 reg71; |
706 | int i; | 722 | int i; |
707 | 723 | ||
708 | //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1)); | 724 | #if 0 /* debug */ |
709 | //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); | 725 | snd_printk(KERN_DEBUG |
710 | //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); | 726 | "prepare:channel_number=%d, rate=%d, format=0x%x, " |
727 | "channels=%d, buffer_size=%ld, period_size=%ld, " | ||
728 | "periods=%u, frames_to_bytes=%d\n", | ||
729 | channel, runtime->rate, runtime->format, | ||
730 | runtime->channels, runtime->buffer_size, | ||
731 | runtime->period_size, runtime->periods, | ||
732 | frames_to_bytes(runtime, 1)); | ||
733 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p\n", | ||
734 | runtime->dma_addr, runtime->dma_area, table_base); | ||
735 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", | ||
736 | emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); | ||
737 | #endif /* debug */ | ||
711 | /* Rate can be set per channel. */ | 738 | /* Rate can be set per channel. */ |
712 | /* reg40 control host to fifo */ | 739 | /* reg40 control host to fifo */ |
713 | /* reg71 controls DAC rate. */ | 740 | /* reg71 controls DAC rate. */ |
@@ -799,9 +826,20 @@ static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream) | |||
799 | u32 reg71_set = 0; | 826 | u32 reg71_set = 0; |
800 | u32 reg71; | 827 | u32 reg71; |
801 | 828 | ||
802 | //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1)); | 829 | #if 0 /* debug */ |
803 | //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); | 830 | snd_printk(KERN_DEBUG |
804 | //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); | 831 | "prepare:channel_number=%d, rate=%d, format=0x%x, " |
832 | "channels=%d, buffer_size=%ld, period_size=%ld, " | ||
833 | "periods=%u, frames_to_bytes=%d\n", | ||
834 | channel, runtime->rate, runtime->format, | ||
835 | runtime->channels, runtime->buffer_size, | ||
836 | runtime->period_size, runtime->periods, | ||
837 | frames_to_bytes(runtime, 1)); | ||
838 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p\n", | ||
839 | runtime->dma_addr, runtime->dma_area, table_base); | ||
840 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", | ||
841 | emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); | ||
842 | #endif /* debug */ | ||
805 | /* reg71 controls ADC rate. */ | 843 | /* reg71 controls ADC rate. */ |
806 | switch (runtime->rate) { | 844 | switch (runtime->rate) { |
807 | case 44100: | 845 | case 44100: |
@@ -846,7 +884,14 @@ static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream) | |||
846 | } | 884 | } |
847 | 885 | ||
848 | 886 | ||
849 | //printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, frames_to_bytes(runtime, 1)); | 887 | /* |
888 | printk(KERN_DEBUG | ||
889 | "prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, " | ||
890 | "buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n", | ||
891 | channel, runtime->rate, runtime->format, runtime->channels, | ||
892 | runtime->buffer_size, runtime->period_size, | ||
893 | frames_to_bytes(runtime, 1)); | ||
894 | */ | ||
850 | snd_ca0106_ptr_write(emu, 0x13, channel, 0); | 895 | snd_ca0106_ptr_write(emu, 0x13, channel, 0); |
851 | snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr); | 896 | snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr); |
852 | snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes | 897 | snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes |
@@ -888,13 +933,13 @@ static int snd_ca0106_pcm_trigger_playback(struct snd_pcm_substream *substream, | |||
888 | runtime = s->runtime; | 933 | runtime = s->runtime; |
889 | epcm = runtime->private_data; | 934 | epcm = runtime->private_data; |
890 | channel = epcm->channel_id; | 935 | channel = epcm->channel_id; |
891 | /* snd_printk("channel=%d\n",channel); */ | 936 | /* snd_printk(KERN_DEBUG "channel=%d\n", channel); */ |
892 | epcm->running = running; | 937 | epcm->running = running; |
893 | basic |= (0x1 << channel); | 938 | basic |= (0x1 << channel); |
894 | extended |= (0x10 << channel); | 939 | extended |= (0x10 << channel); |
895 | snd_pcm_trigger_done(s, substream); | 940 | snd_pcm_trigger_done(s, substream); |
896 | } | 941 | } |
897 | /* snd_printk("basic=0x%x, extended=0x%x\n",basic, extended); */ | 942 | /* snd_printk(KERN_DEBUG "basic=0x%x, extended=0x%x\n",basic, extended); */ |
898 | 943 | ||
899 | switch (cmd) { | 944 | switch (cmd) { |
900 | case SNDRV_PCM_TRIGGER_START: | 945 | case SNDRV_PCM_TRIGGER_START: |
@@ -972,8 +1017,13 @@ snd_ca0106_pcm_pointer_playback(struct snd_pcm_substream *substream) | |||
972 | ptr=ptr2; | 1017 | ptr=ptr2; |
973 | if (ptr >= runtime->buffer_size) | 1018 | if (ptr >= runtime->buffer_size) |
974 | ptr -= runtime->buffer_size; | 1019 | ptr -= runtime->buffer_size; |
975 | //printk("ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate); | 1020 | /* |
976 | 1021 | printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, " | |
1022 | "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", | ||
1023 | ptr1, ptr2, ptr, (int)runtime->buffer_size, | ||
1024 | (int)runtime->period_size, (int)runtime->frame_bits, | ||
1025 | (int)runtime->rate); | ||
1026 | */ | ||
977 | return ptr; | 1027 | return ptr; |
978 | } | 1028 | } |
979 | 1029 | ||
@@ -995,8 +1045,13 @@ snd_ca0106_pcm_pointer_capture(struct snd_pcm_substream *substream) | |||
995 | ptr=ptr2; | 1045 | ptr=ptr2; |
996 | if (ptr >= runtime->buffer_size) | 1046 | if (ptr >= runtime->buffer_size) |
997 | ptr -= runtime->buffer_size; | 1047 | ptr -= runtime->buffer_size; |
998 | //printk("ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate); | 1048 | /* |
999 | 1049 | printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, " | |
1050 | "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", | ||
1051 | ptr1, ptr2, ptr, (int)runtime->buffer_size, | ||
1052 | (int)runtime->period_size, (int)runtime->frame_bits, | ||
1053 | (int)runtime->rate); | ||
1054 | */ | ||
1000 | return ptr; | 1055 | return ptr; |
1001 | } | 1056 | } |
1002 | 1057 | ||
@@ -1181,8 +1236,12 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id) | |||
1181 | return IRQ_NONE; | 1236 | return IRQ_NONE; |
1182 | 1237 | ||
1183 | stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0); | 1238 | stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0); |
1184 | //snd_printk("interrupt status = 0x%08x, stat76=0x%08x\n", status, stat76); | 1239 | /* |
1185 | //snd_printk("ptr=0x%08x\n",snd_ca0106_ptr_read(chip, PLAYBACK_POINTER, 0)); | 1240 | snd_printk(KERN_DEBUG "interrupt status = 0x%08x, stat76=0x%08x\n", |
1241 | status, stat76); | ||
1242 | snd_printk(KERN_DEBUG "ptr=0x%08x\n", | ||
1243 | snd_ca0106_ptr_read(chip, PLAYBACK_POINTER, 0)); | ||
1244 | */ | ||
1186 | mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */ | 1245 | mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */ |
1187 | for(i = 0; i < 4; i++) { | 1246 | for(i = 0; i < 4; i++) { |
1188 | pchannel = &(chip->playback_channels[i]); | 1247 | pchannel = &(chip->playback_channels[i]); |
@@ -1470,7 +1529,7 @@ static void ca0106_init_chip(struct snd_ca0106 *chip, int resume) | |||
1470 | int size, n; | 1529 | int size, n; |
1471 | 1530 | ||
1472 | size = ARRAY_SIZE(i2c_adc_init); | 1531 | size = ARRAY_SIZE(i2c_adc_init); |
1473 | /* snd_printk("I2C:array size=0x%x\n", size); */ | 1532 | /* snd_printk(KERN_DEBUG "I2C:array size=0x%x\n", size); */ |
1474 | for (n = 0; n < size; n++) | 1533 | for (n = 0; n < size; n++) |
1475 | snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], | 1534 | snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], |
1476 | i2c_adc_init[n][1]); | 1535 | i2c_adc_init[n][1]); |
@@ -1530,8 +1589,8 @@ static int __devinit snd_ca0106_create(int dev, struct snd_card *card, | |||
1530 | err = pci_enable_device(pci); | 1589 | err = pci_enable_device(pci); |
1531 | if (err < 0) | 1590 | if (err < 0) |
1532 | return err; | 1591 | return err; |
1533 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || | 1592 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 || |
1534 | pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 1593 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
1535 | printk(KERN_ERR "error to set 32bit mask DMA\n"); | 1594 | printk(KERN_ERR "error to set 32bit mask DMA\n"); |
1536 | pci_disable_device(pci); | 1595 | pci_disable_device(pci); |
1537 | return -ENXIO; | 1596 | return -ENXIO; |
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index c7899c32aba1..449fe02f666e 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c | |||
@@ -3014,7 +3014,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc | |||
3014 | .dev_free = snd_cmipci_dev_free, | 3014 | .dev_free = snd_cmipci_dev_free, |
3015 | }; | 3015 | }; |
3016 | unsigned int val; | 3016 | unsigned int val; |
3017 | long iomidi; | 3017 | long iomidi = 0; |
3018 | int integrated_midi = 0; | 3018 | int integrated_midi = 0; |
3019 | char modelstr[16]; | 3019 | char modelstr[16]; |
3020 | int pcm_index, pcm_spdif_index; | 3020 | int pcm_index, pcm_spdif_index; |
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index b9b07f464631..f6286f84a221 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c | |||
@@ -834,7 +834,11 @@ static snd_pcm_uframes_t snd_cs4281_pointer(struct snd_pcm_substream *substream) | |||
834 | struct cs4281_dma *dma = runtime->private_data; | 834 | struct cs4281_dma *dma = runtime->private_data; |
835 | struct cs4281 *chip = snd_pcm_substream_chip(substream); | 835 | struct cs4281 *chip = snd_pcm_substream_chip(substream); |
836 | 836 | ||
837 | // printk("DCC = 0x%x, buffer_size = 0x%x, jiffies = %li\n", snd_cs4281_peekBA0(chip, dma->regDCC), runtime->buffer_size, jiffies); | 837 | /* |
838 | printk(KERN_DEBUG "DCC = 0x%x, buffer_size = 0x%x, jiffies = %li\n", | ||
839 | snd_cs4281_peekBA0(chip, dma->regDCC), runtime->buffer_size, | ||
840 | jiffies); | ||
841 | */ | ||
838 | return runtime->buffer_size - | 842 | return runtime->buffer_size - |
839 | snd_cs4281_peekBA0(chip, dma->regDCC) - 1; | 843 | snd_cs4281_peekBA0(chip, dma->regDCC) - 1; |
840 | } | 844 | } |
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 8ab07aa63652..1be96ead4244 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c | |||
@@ -194,7 +194,7 @@ static unsigned short snd_cs46xx_codec_read(struct snd_cs46xx *chip, | |||
194 | * ACSDA = Status Data Register = 474h | 194 | * ACSDA = Status Data Register = 474h |
195 | */ | 195 | */ |
196 | #if 0 | 196 | #if 0 |
197 | printk("e) reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n", reg, | 197 | printk(KERN_DEBUG "e) reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n", reg, |
198 | snd_cs46xx_peekBA0(chip, BA0_ACSDA), | 198 | snd_cs46xx_peekBA0(chip, BA0_ACSDA), |
199 | snd_cs46xx_peekBA0(chip, BA0_ACCAD)); | 199 | snd_cs46xx_peekBA0(chip, BA0_ACCAD)); |
200 | #endif | 200 | #endif |
@@ -428,8 +428,8 @@ static int cs46xx_wait_for_fifo(struct snd_cs46xx * chip,int retry_timeout) | |||
428 | } | 428 | } |
429 | 429 | ||
430 | if(status & SERBST_WBSY) { | 430 | if(status & SERBST_WBSY) { |
431 | snd_printk( KERN_ERR "cs46xx: failure waiting for FIFO command to complete\n"); | 431 | snd_printk(KERN_ERR "cs46xx: failure waiting for " |
432 | 432 | "FIFO command to complete\n"); | |
433 | return -EINVAL; | 433 | return -EINVAL; |
434 | } | 434 | } |
435 | 435 | ||
diff --git a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h index 018a7de56017..4eb55aa33612 100644 --- a/sound/pci/cs46xx/cs46xx_lib.h +++ b/sound/pci/cs46xx/cs46xx_lib.h | |||
@@ -62,7 +62,11 @@ static inline void snd_cs46xx_poke(struct snd_cs46xx *chip, unsigned long reg, u | |||
62 | unsigned int bank = reg >> 16; | 62 | unsigned int bank = reg >> 16; |
63 | unsigned int offset = reg & 0xffff; | 63 | unsigned int offset = reg & 0xffff; |
64 | 64 | ||
65 | /*if (bank == 0) printk("snd_cs46xx_poke: %04X - %08X\n",reg >> 2,val); */ | 65 | /* |
66 | if (bank == 0) | ||
67 | printk(KERN_DEBUG "snd_cs46xx_poke: %04X - %08X\n", | ||
68 | reg >> 2,val); | ||
69 | */ | ||
66 | writel(val, chip->region.idx[bank+1].remap_addr + offset); | 70 | writel(val, chip->region.idx[bank+1].remap_addr + offset); |
67 | } | 71 | } |
68 | 72 | ||
diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index ac1d72e0a1e4..05f56e04849b 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c | |||
@@ -285,8 +285,8 @@ static int __devinit snd_cs5535audio_create(struct snd_card *card, | |||
285 | if ((err = pci_enable_device(pci)) < 0) | 285 | if ((err = pci_enable_device(pci)) < 0) |
286 | return err; | 286 | return err; |
287 | 287 | ||
288 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || | 288 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 || |
289 | pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 289 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
290 | printk(KERN_WARNING "unable to get 32bit dma\n"); | 290 | printk(KERN_WARNING "unable to get 32bit dma\n"); |
291 | err = -ENXIO; | 291 | err = -ENXIO; |
292 | goto pcifail; | 292 | goto pcifail; |
@@ -312,7 +312,7 @@ static int __devinit snd_cs5535audio_create(struct snd_card *card, | |||
312 | 312 | ||
313 | if (request_irq(pci->irq, snd_cs5535audio_interrupt, | 313 | if (request_irq(pci->irq, snd_cs5535audio_interrupt, |
314 | IRQF_SHARED, "CS5535 Audio", cs5535au)) { | 314 | IRQF_SHARED, "CS5535 Audio", cs5535au)) { |
315 | snd_printk("unable to grab IRQ %d\n", pci->irq); | 315 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); |
316 | err = -EBUSY; | 316 | err = -EBUSY; |
317 | goto sndfail; | 317 | goto sndfail; |
318 | } | 318 | } |
diff --git a/sound/pci/echoaudio/Makefile b/sound/pci/echoaudio/Makefile index 7b576aeb3f8d..1361de77e0cd 100644 --- a/sound/pci/echoaudio/Makefile +++ b/sound/pci/echoaudio/Makefile | |||
@@ -15,6 +15,8 @@ snd-echo3g-objs := echo3g.o | |||
15 | snd-indigo-objs := indigo.o | 15 | snd-indigo-objs := indigo.o |
16 | snd-indigoio-objs := indigoio.o | 16 | snd-indigoio-objs := indigoio.o |
17 | snd-indigodj-objs := indigodj.o | 17 | snd-indigodj-objs := indigodj.o |
18 | snd-indigoiox-objs := indigoiox.o | ||
19 | snd-indigodjx-objs := indigodjx.o | ||
18 | 20 | ||
19 | obj-$(CONFIG_SND_DARLA20) += snd-darla20.o | 21 | obj-$(CONFIG_SND_DARLA20) += snd-darla20.o |
20 | obj-$(CONFIG_SND_GINA20) += snd-gina20.o | 22 | obj-$(CONFIG_SND_GINA20) += snd-gina20.o |
@@ -28,3 +30,5 @@ obj-$(CONFIG_SND_ECHO3G) += snd-echo3g.o | |||
28 | obj-$(CONFIG_SND_INDIGO) += snd-indigo.o | 30 | obj-$(CONFIG_SND_INDIGO) += snd-indigo.o |
29 | obj-$(CONFIG_SND_INDIGOIO) += snd-indigoio.o | 31 | obj-$(CONFIG_SND_INDIGOIO) += snd-indigoio.o |
30 | obj-$(CONFIG_SND_INDIGODJ) += snd-indigodj.o | 32 | obj-$(CONFIG_SND_INDIGODJ) += snd-indigodj.o |
33 | obj-$(CONFIG_SND_INDIGOIOX) += snd-indigoiox.o | ||
34 | obj-$(CONFIG_SND_INDIGODJX) += snd-indigodjx.o | ||
diff --git a/sound/pci/echoaudio/echo3g_dsp.c b/sound/pci/echoaudio/echo3g_dsp.c index 417e25add82b..57967e580571 100644 --- a/sound/pci/echoaudio/echo3g_dsp.c +++ b/sound/pci/echoaudio/echo3g_dsp.c | |||
@@ -56,7 +56,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | |||
56 | } | 56 | } |
57 | 57 | ||
58 | chip->comm_page->e3g_frq_register = | 58 | chip->comm_page->e3g_frq_register = |
59 | __constant_cpu_to_le32((E3G_MAGIC_NUMBER / 48000) - 2); | 59 | cpu_to_le32((E3G_MAGIC_NUMBER / 48000) - 2); |
60 | chip->device_id = device_id; | 60 | chip->device_id = device_id; |
61 | chip->subdevice_id = subdevice_id; | 61 | chip->subdevice_id = subdevice_id; |
62 | chip->bad_board = TRUE; | 62 | chip->bad_board = TRUE; |
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index 9d015a76eb69..da2065cd2c0d 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c | |||
@@ -950,6 +950,8 @@ static int __devinit snd_echo_new_pcm(struct echoaudio *chip) | |||
950 | Control interface | 950 | Control interface |
951 | ******************************************************************************/ | 951 | ******************************************************************************/ |
952 | 952 | ||
953 | #ifndef ECHOCARD_HAS_VMIXER | ||
954 | |||
953 | /******************* PCM output volume *******************/ | 955 | /******************* PCM output volume *******************/ |
954 | static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol, | 956 | static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol, |
955 | struct snd_ctl_elem_info *uinfo) | 957 | struct snd_ctl_elem_info *uinfo) |
@@ -1001,18 +1003,6 @@ static int snd_echo_output_gain_put(struct snd_kcontrol *kcontrol, | |||
1001 | return changed; | 1003 | return changed; |
1002 | } | 1004 | } |
1003 | 1005 | ||
1004 | #ifdef ECHOCARD_HAS_VMIXER | ||
1005 | /* On Vmixer cards this one controls the line-out volume */ | ||
1006 | static struct snd_kcontrol_new snd_echo_line_output_gain __devinitdata = { | ||
1007 | .name = "Line Playback Volume", | ||
1008 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1009 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, | ||
1010 | .info = snd_echo_output_gain_info, | ||
1011 | .get = snd_echo_output_gain_get, | ||
1012 | .put = snd_echo_output_gain_put, | ||
1013 | .tlv = {.p = db_scale_output_gain}, | ||
1014 | }; | ||
1015 | #else | ||
1016 | static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = { | 1006 | static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = { |
1017 | .name = "PCM Playback Volume", | 1007 | .name = "PCM Playback Volume", |
1018 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1008 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -1022,6 +1012,7 @@ static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = { | |||
1022 | .put = snd_echo_output_gain_put, | 1012 | .put = snd_echo_output_gain_put, |
1023 | .tlv = {.p = db_scale_output_gain}, | 1013 | .tlv = {.p = db_scale_output_gain}, |
1024 | }; | 1014 | }; |
1015 | |||
1025 | #endif | 1016 | #endif |
1026 | 1017 | ||
1027 | 1018 | ||
@@ -2037,8 +2028,6 @@ static int __devinit snd_echo_probe(struct pci_dev *pci, | |||
2037 | 2028 | ||
2038 | #ifdef ECHOCARD_HAS_VMIXER | 2029 | #ifdef ECHOCARD_HAS_VMIXER |
2039 | snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip); | 2030 | snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip); |
2040 | if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_output_gain, chip))) < 0) | ||
2041 | goto ctl_error; | ||
2042 | if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0) | 2031 | if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0) |
2043 | goto ctl_error; | 2032 | goto ctl_error; |
2044 | #else | 2033 | #else |
diff --git a/sound/pci/echoaudio/echoaudio.h b/sound/pci/echoaudio/echoaudio.h index 1c88e051abf2..f9490ae36c2e 100644 --- a/sound/pci/echoaudio/echoaudio.h +++ b/sound/pci/echoaudio/echoaudio.h | |||
@@ -189,6 +189,9 @@ | |||
189 | #define INDIGO 0x0090 | 189 | #define INDIGO 0x0090 |
190 | #define INDIGO_IO 0x00a0 | 190 | #define INDIGO_IO 0x00a0 |
191 | #define INDIGO_DJ 0x00b0 | 191 | #define INDIGO_DJ 0x00b0 |
192 | #define DC8 0x00c0 | ||
193 | #define INDIGO_IOX 0x00d0 | ||
194 | #define INDIGO_DJX 0x00e0 | ||
192 | #define ECHO3G 0x0100 | 195 | #define ECHO3G 0x0100 |
193 | 196 | ||
194 | 197 | ||
diff --git a/sound/pci/echoaudio/echoaudio_3g.c b/sound/pci/echoaudio/echoaudio_3g.c index c3736bbd819e..e32a74897921 100644 --- a/sound/pci/echoaudio/echoaudio_3g.c +++ b/sound/pci/echoaudio/echoaudio_3g.c | |||
@@ -40,8 +40,7 @@ static int check_asic_status(struct echoaudio *chip) | |||
40 | if (wait_handshake(chip)) | 40 | if (wait_handshake(chip)) |
41 | return -EIO; | 41 | return -EIO; |
42 | 42 | ||
43 | chip->comm_page->ext_box_status = | 43 | chip->comm_page->ext_box_status = cpu_to_le32(E3G_ASIC_NOT_LOADED); |
44 | __constant_cpu_to_le32(E3G_ASIC_NOT_LOADED); | ||
45 | chip->asic_loaded = FALSE; | 44 | chip->asic_loaded = FALSE; |
46 | clear_handshake(chip); | 45 | clear_handshake(chip); |
47 | send_vector(chip, DSP_VC_TEST_ASIC); | 46 | send_vector(chip, DSP_VC_TEST_ASIC); |
diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c index be0e18192de3..4df51ef5e095 100644 --- a/sound/pci/echoaudio/echoaudio_dsp.c +++ b/sound/pci/echoaudio/echoaudio_dsp.c | |||
@@ -926,11 +926,11 @@ static int init_dsp_comm_page(struct echoaudio *chip) | |||
926 | 926 | ||
927 | /* Init the comm page */ | 927 | /* Init the comm page */ |
928 | chip->comm_page->comm_size = | 928 | chip->comm_page->comm_size = |
929 | __constant_cpu_to_le32(sizeof(struct comm_page)); | 929 | cpu_to_le32(sizeof(struct comm_page)); |
930 | chip->comm_page->handshake = 0xffffffff; | 930 | chip->comm_page->handshake = 0xffffffff; |
931 | chip->comm_page->midi_out_free_count = | 931 | chip->comm_page->midi_out_free_count = |
932 | __constant_cpu_to_le32(DSP_MIDI_OUT_FIFO_SIZE); | 932 | cpu_to_le32(DSP_MIDI_OUT_FIFO_SIZE); |
933 | chip->comm_page->sample_rate = __constant_cpu_to_le32(44100); | 933 | chip->comm_page->sample_rate = cpu_to_le32(44100); |
934 | chip->sample_rate = 44100; | 934 | chip->sample_rate = 44100; |
935 | 935 | ||
936 | /* Set line levels so we don't blast any inputs on startup */ | 936 | /* Set line levels so we don't blast any inputs on startup */ |
diff --git a/sound/pci/echoaudio/echoaudio_dsp.h b/sound/pci/echoaudio/echoaudio_dsp.h index e352f3ae292c..cb7d75a0a503 100644 --- a/sound/pci/echoaudio/echoaudio_dsp.h +++ b/sound/pci/echoaudio/echoaudio_dsp.h | |||
@@ -576,8 +576,13 @@ SET_LAYLA24_FREQUENCY_REG command. | |||
576 | #define E3G_ASIC_NOT_LOADED 0xffff | 576 | #define E3G_ASIC_NOT_LOADED 0xffff |
577 | #define E3G_BOX_TYPE_MASK 0xf0 | 577 | #define E3G_BOX_TYPE_MASK 0xf0 |
578 | 578 | ||
579 | #define EXT_3GBOX_NC 0x01 | 579 | /* Indigo express control register values */ |
580 | #define EXT_3GBOX_NOT_SET 0x02 | 580 | #define INDIGO_EXPRESS_32000 0x02 |
581 | #define INDIGO_EXPRESS_44100 0x01 | ||
582 | #define INDIGO_EXPRESS_48000 0x00 | ||
583 | #define INDIGO_EXPRESS_DOUBLE_SPEED 0x10 | ||
584 | #define INDIGO_EXPRESS_QUAD_SPEED 0x04 | ||
585 | #define INDIGO_EXPRESS_CLOCK_MASK 0x17 | ||
581 | 586 | ||
582 | 587 | ||
583 | /* | 588 | /* |
diff --git a/sound/pci/echoaudio/gina20_dsp.c b/sound/pci/echoaudio/gina20_dsp.c index db6c952e9d7f..3f1e7475faea 100644 --- a/sound/pci/echoaudio/gina20_dsp.c +++ b/sound/pci/echoaudio/gina20_dsp.c | |||
@@ -208,10 +208,10 @@ static int set_professional_spdif(struct echoaudio *chip, char prof) | |||
208 | DE_ACT(("set_professional_spdif %d\n", prof)); | 208 | DE_ACT(("set_professional_spdif %d\n", prof)); |
209 | if (prof) | 209 | if (prof) |
210 | chip->comm_page->flags |= | 210 | chip->comm_page->flags |= |
211 | __constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 211 | cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
212 | else | 212 | else |
213 | chip->comm_page->flags &= | 213 | chip->comm_page->flags &= |
214 | ~__constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 214 | ~cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
215 | chip->professional_spdif = prof; | 215 | chip->professional_spdif = prof; |
216 | return update_flags(chip); | 216 | return update_flags(chip); |
217 | } | 217 | } |
diff --git a/sound/pci/echoaudio/indigo_dsp.c b/sound/pci/echoaudio/indigo_dsp.c index f05e39f7aad9..0b2cd9c86277 100644 --- a/sound/pci/echoaudio/indigo_dsp.c +++ b/sound/pci/echoaudio/indigo_dsp.c | |||
@@ -63,18 +63,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | |||
63 | if ((err = init_line_levels(chip)) < 0) | 63 | if ((err = init_line_levels(chip)) < 0) |
64 | return err; | 64 | return err; |
65 | 65 | ||
66 | /* Default routing of the virtual channels: all vchannels are routed | ||
67 | to the stereo output */ | ||
68 | set_vmixer_gain(chip, 0, 0, 0); | ||
69 | set_vmixer_gain(chip, 1, 1, 0); | ||
70 | set_vmixer_gain(chip, 0, 2, 0); | ||
71 | set_vmixer_gain(chip, 1, 3, 0); | ||
72 | set_vmixer_gain(chip, 0, 4, 0); | ||
73 | set_vmixer_gain(chip, 1, 5, 0); | ||
74 | set_vmixer_gain(chip, 0, 6, 0); | ||
75 | set_vmixer_gain(chip, 1, 7, 0); | ||
76 | err = update_vmixer_level(chip); | ||
77 | |||
78 | DE_INIT(("init_hw done\n")); | 66 | DE_INIT(("init_hw done\n")); |
79 | return err; | 67 | return err; |
80 | } | 68 | } |
diff --git a/sound/pci/echoaudio/indigo_express_dsp.c b/sound/pci/echoaudio/indigo_express_dsp.c new file mode 100644 index 000000000000..9ab625e15652 --- /dev/null +++ b/sound/pci/echoaudio/indigo_express_dsp.c | |||
@@ -0,0 +1,119 @@ | |||
1 | /************************************************************************ | ||
2 | |||
3 | This file is part of Echo Digital Audio's generic driver library. | ||
4 | Copyright Echo Digital Audio Corporation (c) 1998 - 2005 | ||
5 | All rights reserved | ||
6 | www.echoaudio.com | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General Public | ||
19 | License along with this library; if not, write to the Free Software | ||
20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | |||
22 | ************************************************************************* | ||
23 | |||
24 | Translation from C++ and adaptation for use in ALSA-Driver | ||
25 | were made by Giuliano Pochini <pochini@shiny.it> | ||
26 | |||
27 | *************************************************************************/ | ||
28 | |||
29 | static int set_sample_rate(struct echoaudio *chip, u32 rate) | ||
30 | { | ||
31 | u32 clock, control_reg, old_control_reg; | ||
32 | |||
33 | if (wait_handshake(chip)) | ||
34 | return -EIO; | ||
35 | |||
36 | old_control_reg = le32_to_cpu(chip->comm_page->control_register); | ||
37 | control_reg = old_control_reg & ~INDIGO_EXPRESS_CLOCK_MASK; | ||
38 | |||
39 | switch (rate) { | ||
40 | case 32000: | ||
41 | clock = INDIGO_EXPRESS_32000; | ||
42 | break; | ||
43 | case 44100: | ||
44 | clock = INDIGO_EXPRESS_44100; | ||
45 | break; | ||
46 | case 48000: | ||
47 | clock = INDIGO_EXPRESS_48000; | ||
48 | break; | ||
49 | case 64000: | ||
50 | clock = INDIGO_EXPRESS_32000|INDIGO_EXPRESS_DOUBLE_SPEED; | ||
51 | break; | ||
52 | case 88200: | ||
53 | clock = INDIGO_EXPRESS_44100|INDIGO_EXPRESS_DOUBLE_SPEED; | ||
54 | break; | ||
55 | case 96000: | ||
56 | clock = INDIGO_EXPRESS_48000|INDIGO_EXPRESS_DOUBLE_SPEED; | ||
57 | break; | ||
58 | default: | ||
59 | return -EINVAL; | ||
60 | } | ||
61 | |||
62 | control_reg |= clock; | ||
63 | if (control_reg != old_control_reg) { | ||
64 | chip->comm_page->control_register = cpu_to_le32(control_reg); | ||
65 | chip->sample_rate = rate; | ||
66 | clear_handshake(chip); | ||
67 | return send_vector(chip, DSP_VC_UPDATE_CLOCKS); | ||
68 | } | ||
69 | return 0; | ||
70 | } | ||
71 | |||
72 | |||
73 | |||
74 | /* This function routes the sound from a virtual channel to a real output */ | ||
75 | static int set_vmixer_gain(struct echoaudio *chip, u16 output, u16 pipe, | ||
76 | int gain) | ||
77 | { | ||
78 | int index; | ||
79 | |||
80 | if (snd_BUG_ON(pipe >= num_pipes_out(chip) || | ||
81 | output >= num_busses_out(chip))) | ||
82 | return -EINVAL; | ||
83 | |||
84 | if (wait_handshake(chip)) | ||
85 | return -EIO; | ||
86 | |||
87 | chip->vmixer_gain[output][pipe] = gain; | ||
88 | index = output * num_pipes_out(chip) + pipe; | ||
89 | chip->comm_page->vmixer[index] = gain; | ||
90 | |||
91 | DE_ACT(("set_vmixer_gain: pipe %d, out %d = %d\n", pipe, output, gain)); | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | |||
96 | |||
97 | /* Tell the DSP to read and update virtual mixer levels in comm page. */ | ||
98 | static int update_vmixer_level(struct echoaudio *chip) | ||
99 | { | ||
100 | if (wait_handshake(chip)) | ||
101 | return -EIO; | ||
102 | clear_handshake(chip); | ||
103 | return send_vector(chip, DSP_VC_SET_VMIXER_GAIN); | ||
104 | } | ||
105 | |||
106 | |||
107 | |||
108 | static u32 detect_input_clocks(const struct echoaudio *chip) | ||
109 | { | ||
110 | return ECHO_CLOCK_BIT_INTERNAL; | ||
111 | } | ||
112 | |||
113 | |||
114 | |||
115 | /* The IndigoIO has no ASIC. Just do nothing */ | ||
116 | static int load_asic(struct echoaudio *chip) | ||
117 | { | ||
118 | return 0; | ||
119 | } | ||
diff --git a/sound/pci/echoaudio/indigodj_dsp.c b/sound/pci/echoaudio/indigodj_dsp.c index 90730a5ecb42..08392916691e 100644 --- a/sound/pci/echoaudio/indigodj_dsp.c +++ b/sound/pci/echoaudio/indigodj_dsp.c | |||
@@ -63,18 +63,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | |||
63 | if ((err = init_line_levels(chip)) < 0) | 63 | if ((err = init_line_levels(chip)) < 0) |
64 | return err; | 64 | return err; |
65 | 65 | ||
66 | /* Default routing of the virtual channels: vchannels 0-3 and | ||
67 | vchannels 4-7 are routed to real channels 0-4 */ | ||
68 | set_vmixer_gain(chip, 0, 0, 0); | ||
69 | set_vmixer_gain(chip, 1, 1, 0); | ||
70 | set_vmixer_gain(chip, 2, 2, 0); | ||
71 | set_vmixer_gain(chip, 3, 3, 0); | ||
72 | set_vmixer_gain(chip, 0, 4, 0); | ||
73 | set_vmixer_gain(chip, 1, 5, 0); | ||
74 | set_vmixer_gain(chip, 2, 6, 0); | ||
75 | set_vmixer_gain(chip, 3, 7, 0); | ||
76 | err = update_vmixer_level(chip); | ||
77 | |||
78 | DE_INIT(("init_hw done\n")); | 66 | DE_INIT(("init_hw done\n")); |
79 | return err; | 67 | return err; |
80 | } | 68 | } |
diff --git a/sound/pci/echoaudio/indigodjx.c b/sound/pci/echoaudio/indigodjx.c new file mode 100644 index 000000000000..3482ef69f491 --- /dev/null +++ b/sound/pci/echoaudio/indigodjx.c | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * ALSA driver for Echoaudio soundcards. | ||
3 | * Copyright (C) 2009 Giuliano Pochini <pochini@shiny.it> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; version 2 of the License. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | */ | ||
18 | |||
19 | #define INDIGO_FAMILY | ||
20 | #define ECHOCARD_INDIGO_DJX | ||
21 | #define ECHOCARD_NAME "Indigo DJx" | ||
22 | #define ECHOCARD_HAS_SUPER_INTERLEAVE | ||
23 | #define ECHOCARD_HAS_VMIXER | ||
24 | #define ECHOCARD_HAS_STEREO_BIG_ENDIAN32 | ||
25 | |||
26 | /* Pipe indexes */ | ||
27 | #define PX_ANALOG_OUT 0 /* 8 */ | ||
28 | #define PX_DIGITAL_OUT 8 /* 0 */ | ||
29 | #define PX_ANALOG_IN 8 /* 0 */ | ||
30 | #define PX_DIGITAL_IN 8 /* 0 */ | ||
31 | #define PX_NUM 8 | ||
32 | |||
33 | /* Bus indexes */ | ||
34 | #define BX_ANALOG_OUT 0 /* 4 */ | ||
35 | #define BX_DIGITAL_OUT 4 /* 0 */ | ||
36 | #define BX_ANALOG_IN 4 /* 0 */ | ||
37 | #define BX_DIGITAL_IN 4 /* 0 */ | ||
38 | #define BX_NUM 4 | ||
39 | |||
40 | |||
41 | #include <linux/delay.h> | ||
42 | #include <linux/init.h> | ||
43 | #include <linux/interrupt.h> | ||
44 | #include <linux/pci.h> | ||
45 | #include <linux/slab.h> | ||
46 | #include <linux/moduleparam.h> | ||
47 | #include <linux/firmware.h> | ||
48 | #include <linux/io.h> | ||
49 | #include <sound/core.h> | ||
50 | #include <sound/info.h> | ||
51 | #include <sound/control.h> | ||
52 | #include <sound/tlv.h> | ||
53 | #include <sound/pcm.h> | ||
54 | #include <sound/pcm_params.h> | ||
55 | #include <sound/asoundef.h> | ||
56 | #include <sound/initval.h> | ||
57 | #include <asm/atomic.h> | ||
58 | #include "echoaudio.h" | ||
59 | |||
60 | MODULE_FIRMWARE("ea/loader_dsp.fw"); | ||
61 | MODULE_FIRMWARE("ea/indigo_djx_dsp.fw"); | ||
62 | |||
63 | #define FW_361_LOADER 0 | ||
64 | #define FW_INDIGO_DJX_DSP 1 | ||
65 | |||
66 | static const struct firmware card_fw[] = { | ||
67 | {0, "loader_dsp.fw"}, | ||
68 | {0, "indigo_djx_dsp.fw"} | ||
69 | }; | ||
70 | |||
71 | static struct pci_device_id snd_echo_ids[] = { | ||
72 | {0x1057, 0x3410, 0xECC0, 0x00E0, 0, 0, 0}, /* Indigo DJx*/ | ||
73 | {0,} | ||
74 | }; | ||
75 | |||
76 | static struct snd_pcm_hardware pcm_hardware_skel = { | ||
77 | .info = SNDRV_PCM_INFO_MMAP | | ||
78 | SNDRV_PCM_INFO_INTERLEAVED | | ||
79 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | ||
80 | SNDRV_PCM_INFO_MMAP_VALID | | ||
81 | SNDRV_PCM_INFO_PAUSE | | ||
82 | SNDRV_PCM_INFO_SYNC_START, | ||
83 | .formats = SNDRV_PCM_FMTBIT_U8 | | ||
84 | SNDRV_PCM_FMTBIT_S16_LE | | ||
85 | SNDRV_PCM_FMTBIT_S24_3LE | | ||
86 | SNDRV_PCM_FMTBIT_S32_LE | | ||
87 | SNDRV_PCM_FMTBIT_S32_BE, | ||
88 | .rates = SNDRV_PCM_RATE_32000 | | ||
89 | SNDRV_PCM_RATE_44100 | | ||
90 | SNDRV_PCM_RATE_48000 | | ||
91 | SNDRV_PCM_RATE_88200 | | ||
92 | SNDRV_PCM_RATE_96000, | ||
93 | .rate_min = 32000, | ||
94 | .rate_max = 96000, | ||
95 | .channels_min = 1, | ||
96 | .channels_max = 4, | ||
97 | .buffer_bytes_max = 262144, | ||
98 | .period_bytes_min = 32, | ||
99 | .period_bytes_max = 131072, | ||
100 | .periods_min = 2, | ||
101 | .periods_max = 220, | ||
102 | }; | ||
103 | |||
104 | #include "indigodjx_dsp.c" | ||
105 | #include "indigo_express_dsp.c" | ||
106 | #include "echoaudio_dsp.c" | ||
107 | #include "echoaudio.c" | ||
diff --git a/sound/pci/echoaudio/indigodjx_dsp.c b/sound/pci/echoaudio/indigodjx_dsp.c new file mode 100644 index 000000000000..f591fc2ed960 --- /dev/null +++ b/sound/pci/echoaudio/indigodjx_dsp.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /************************************************************************ | ||
2 | |||
3 | This file is part of Echo Digital Audio's generic driver library. | ||
4 | Copyright Echo Digital Audio Corporation (c) 1998 - 2005 | ||
5 | All rights reserved | ||
6 | www.echoaudio.com | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General Public | ||
19 | License along with this library; if not, write to the Free Software | ||
20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | |||
22 | ************************************************************************* | ||
23 | |||
24 | Translation from C++ and adaptation for use in ALSA-Driver | ||
25 | were made by Giuliano Pochini <pochini@shiny.it> | ||
26 | |||
27 | *************************************************************************/ | ||
28 | |||
29 | static int update_vmixer_level(struct echoaudio *chip); | ||
30 | static int set_vmixer_gain(struct echoaudio *chip, u16 output, | ||
31 | u16 pipe, int gain); | ||
32 | |||
33 | |||
34 | static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | ||
35 | { | ||
36 | int err; | ||
37 | |||
38 | DE_INIT(("init_hw() - Indigo DJx\n")); | ||
39 | if (snd_BUG_ON((subdevice_id & 0xfff0) != INDIGO_DJX)) | ||
40 | return -ENODEV; | ||
41 | |||
42 | err = init_dsp_comm_page(chip); | ||
43 | if (err < 0) { | ||
44 | DE_INIT(("init_hw - could not initialize DSP comm page\n")); | ||
45 | return err; | ||
46 | } | ||
47 | |||
48 | chip->device_id = device_id; | ||
49 | chip->subdevice_id = subdevice_id; | ||
50 | chip->bad_board = TRUE; | ||
51 | chip->dsp_code_to_load = &card_fw[FW_INDIGO_DJX_DSP]; | ||
52 | /* Since this card has no ASIC, mark it as loaded so everything | ||
53 | works OK */ | ||
54 | chip->asic_loaded = TRUE; | ||
55 | chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL; | ||
56 | |||
57 | err = load_firmware(chip); | ||
58 | if (err < 0) | ||
59 | return err; | ||
60 | chip->bad_board = FALSE; | ||
61 | |||
62 | err = init_line_levels(chip); | ||
63 | if (err < 0) | ||
64 | return err; | ||
65 | |||
66 | DE_INIT(("init_hw done\n")); | ||
67 | return err; | ||
68 | } | ||
diff --git a/sound/pci/echoaudio/indigoio_dsp.c b/sound/pci/echoaudio/indigoio_dsp.c index a7e09ec21079..0604c8a85223 100644 --- a/sound/pci/echoaudio/indigoio_dsp.c +++ b/sound/pci/echoaudio/indigoio_dsp.c | |||
@@ -63,18 +63,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | |||
63 | if ((err = init_line_levels(chip)) < 0) | 63 | if ((err = init_line_levels(chip)) < 0) |
64 | return err; | 64 | return err; |
65 | 65 | ||
66 | /* Default routing of the virtual channels: all vchannels are routed | ||
67 | to the stereo output */ | ||
68 | set_vmixer_gain(chip, 0, 0, 0); | ||
69 | set_vmixer_gain(chip, 1, 1, 0); | ||
70 | set_vmixer_gain(chip, 0, 2, 0); | ||
71 | set_vmixer_gain(chip, 1, 3, 0); | ||
72 | set_vmixer_gain(chip, 0, 4, 0); | ||
73 | set_vmixer_gain(chip, 1, 5, 0); | ||
74 | set_vmixer_gain(chip, 0, 6, 0); | ||
75 | set_vmixer_gain(chip, 1, 7, 0); | ||
76 | err = update_vmixer_level(chip); | ||
77 | |||
78 | DE_INIT(("init_hw done\n")); | 66 | DE_INIT(("init_hw done\n")); |
79 | return err; | 67 | return err; |
80 | } | 68 | } |
diff --git a/sound/pci/echoaudio/indigoiox.c b/sound/pci/echoaudio/indigoiox.c new file mode 100644 index 000000000000..aebee27a40ff --- /dev/null +++ b/sound/pci/echoaudio/indigoiox.c | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
2 | * ALSA driver for Echoaudio soundcards. | ||
3 | * Copyright (C) 2009 Giuliano Pochini <pochini@shiny.it> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; version 2 of the License. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | */ | ||
18 | |||
19 | #define INDIGO_FAMILY | ||
20 | #define ECHOCARD_INDIGO_IOX | ||
21 | #define ECHOCARD_NAME "Indigo IOx" | ||
22 | #define ECHOCARD_HAS_MONITOR | ||
23 | #define ECHOCARD_HAS_SUPER_INTERLEAVE | ||
24 | #define ECHOCARD_HAS_VMIXER | ||
25 | #define ECHOCARD_HAS_STEREO_BIG_ENDIAN32 | ||
26 | |||
27 | /* Pipe indexes */ | ||
28 | #define PX_ANALOG_OUT 0 /* 8 */ | ||
29 | #define PX_DIGITAL_OUT 8 /* 0 */ | ||
30 | #define PX_ANALOG_IN 8 /* 2 */ | ||
31 | #define PX_DIGITAL_IN 10 /* 0 */ | ||
32 | #define PX_NUM 10 | ||
33 | |||
34 | /* Bus indexes */ | ||
35 | #define BX_ANALOG_OUT 0 /* 2 */ | ||
36 | #define BX_DIGITAL_OUT 2 /* 0 */ | ||
37 | #define BX_ANALOG_IN 2 /* 2 */ | ||
38 | #define BX_DIGITAL_IN 4 /* 0 */ | ||
39 | #define BX_NUM 4 | ||
40 | |||
41 | |||
42 | #include <linux/delay.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/interrupt.h> | ||
45 | #include <linux/pci.h> | ||
46 | #include <linux/slab.h> | ||
47 | #include <linux/moduleparam.h> | ||
48 | #include <linux/firmware.h> | ||
49 | #include <linux/io.h> | ||
50 | #include <sound/core.h> | ||
51 | #include <sound/info.h> | ||
52 | #include <sound/control.h> | ||
53 | #include <sound/tlv.h> | ||
54 | #include <sound/pcm.h> | ||
55 | #include <sound/pcm_params.h> | ||
56 | #include <sound/asoundef.h> | ||
57 | #include <sound/initval.h> | ||
58 | #include <asm/atomic.h> | ||
59 | #include "echoaudio.h" | ||
60 | |||
61 | MODULE_FIRMWARE("ea/loader_dsp.fw"); | ||
62 | MODULE_FIRMWARE("ea/indigo_iox_dsp.fw"); | ||
63 | |||
64 | #define FW_361_LOADER 0 | ||
65 | #define FW_INDIGO_IOX_DSP 1 | ||
66 | |||
67 | static const struct firmware card_fw[] = { | ||
68 | {0, "loader_dsp.fw"}, | ||
69 | {0, "indigo_iox_dsp.fw"} | ||
70 | }; | ||
71 | |||
72 | static struct pci_device_id snd_echo_ids[] = { | ||
73 | {0x1057, 0x3410, 0xECC0, 0x00D0, 0, 0, 0}, /* Indigo IOx */ | ||
74 | {0,} | ||
75 | }; | ||
76 | |||
77 | static struct snd_pcm_hardware pcm_hardware_skel = { | ||
78 | .info = SNDRV_PCM_INFO_MMAP | | ||
79 | SNDRV_PCM_INFO_INTERLEAVED | | ||
80 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | ||
81 | SNDRV_PCM_INFO_MMAP_VALID | | ||
82 | SNDRV_PCM_INFO_PAUSE | | ||
83 | SNDRV_PCM_INFO_SYNC_START, | ||
84 | .formats = SNDRV_PCM_FMTBIT_U8 | | ||
85 | SNDRV_PCM_FMTBIT_S16_LE | | ||
86 | SNDRV_PCM_FMTBIT_S24_3LE | | ||
87 | SNDRV_PCM_FMTBIT_S32_LE | | ||
88 | SNDRV_PCM_FMTBIT_S32_BE, | ||
89 | .rates = SNDRV_PCM_RATE_32000 | | ||
90 | SNDRV_PCM_RATE_44100 | | ||
91 | SNDRV_PCM_RATE_48000 | | ||
92 | SNDRV_PCM_RATE_88200 | | ||
93 | SNDRV_PCM_RATE_96000, | ||
94 | .rate_min = 32000, | ||
95 | .rate_max = 96000, | ||
96 | .channels_min = 1, | ||
97 | .channels_max = 8, | ||
98 | .buffer_bytes_max = 262144, | ||
99 | .period_bytes_min = 32, | ||
100 | .period_bytes_max = 131072, | ||
101 | .periods_min = 2, | ||
102 | .periods_max = 220, | ||
103 | }; | ||
104 | |||
105 | #include "indigoiox_dsp.c" | ||
106 | #include "indigo_express_dsp.c" | ||
107 | #include "echoaudio_dsp.c" | ||
108 | #include "echoaudio.c" | ||
109 | |||
diff --git a/sound/pci/echoaudio/indigoiox_dsp.c b/sound/pci/echoaudio/indigoiox_dsp.c new file mode 100644 index 000000000000..f357521c79e6 --- /dev/null +++ b/sound/pci/echoaudio/indigoiox_dsp.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /************************************************************************ | ||
2 | |||
3 | This file is part of Echo Digital Audio's generic driver library. | ||
4 | Copyright Echo Digital Audio Corporation (c) 1998 - 2005 | ||
5 | All rights reserved | ||
6 | www.echoaudio.com | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General Public | ||
19 | License along with this library; if not, write to the Free Software | ||
20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | |||
22 | ************************************************************************* | ||
23 | |||
24 | Translation from C++ and adaptation for use in ALSA-Driver | ||
25 | were made by Giuliano Pochini <pochini@shiny.it> | ||
26 | |||
27 | *************************************************************************/ | ||
28 | |||
29 | static int update_vmixer_level(struct echoaudio *chip); | ||
30 | static int set_vmixer_gain(struct echoaudio *chip, u16 output, | ||
31 | u16 pipe, int gain); | ||
32 | |||
33 | |||
34 | static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | ||
35 | { | ||
36 | int err; | ||
37 | |||
38 | DE_INIT(("init_hw() - Indigo IOx\n")); | ||
39 | if (snd_BUG_ON((subdevice_id & 0xfff0) != INDIGO_IOX)) | ||
40 | return -ENODEV; | ||
41 | |||
42 | err = init_dsp_comm_page(chip); | ||
43 | if (err < 0) { | ||
44 | DE_INIT(("init_hw - could not initialize DSP comm page\n")); | ||
45 | return err; | ||
46 | } | ||
47 | |||
48 | chip->device_id = device_id; | ||
49 | chip->subdevice_id = subdevice_id; | ||
50 | chip->bad_board = TRUE; | ||
51 | chip->dsp_code_to_load = &card_fw[FW_INDIGO_IOX_DSP]; | ||
52 | /* Since this card has no ASIC, mark it as loaded so everything | ||
53 | works OK */ | ||
54 | chip->asic_loaded = TRUE; | ||
55 | chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL; | ||
56 | |||
57 | err = load_firmware(chip); | ||
58 | if (err < 0) | ||
59 | return err; | ||
60 | chip->bad_board = FALSE; | ||
61 | |||
62 | err = init_line_levels(chip); | ||
63 | if (err < 0) | ||
64 | return err; | ||
65 | |||
66 | DE_INIT(("init_hw done\n")); | ||
67 | return err; | ||
68 | } | ||
diff --git a/sound/pci/echoaudio/layla20_dsp.c b/sound/pci/echoaudio/layla20_dsp.c index ede75c6ca0fb..83750e9fd7b4 100644 --- a/sound/pci/echoaudio/layla20_dsp.c +++ b/sound/pci/echoaudio/layla20_dsp.c | |||
@@ -284,10 +284,10 @@ static int set_professional_spdif(struct echoaudio *chip, char prof) | |||
284 | DE_ACT(("set_professional_spdif %d\n", prof)); | 284 | DE_ACT(("set_professional_spdif %d\n", prof)); |
285 | if (prof) | 285 | if (prof) |
286 | chip->comm_page->flags |= | 286 | chip->comm_page->flags |= |
287 | __constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 287 | cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
288 | else | 288 | else |
289 | chip->comm_page->flags &= | 289 | chip->comm_page->flags &= |
290 | ~__constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 290 | ~cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
291 | chip->professional_spdif = prof; | 291 | chip->professional_spdif = prof; |
292 | return update_flags(chip); | 292 | return update_flags(chip); |
293 | } | 293 | } |
diff --git a/sound/pci/echoaudio/mia_dsp.c b/sound/pci/echoaudio/mia_dsp.c index 227386602f9b..551405114cbc 100644 --- a/sound/pci/echoaudio/mia_dsp.c +++ b/sound/pci/echoaudio/mia_dsp.c | |||
@@ -69,18 +69,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) | |||
69 | if ((err = init_line_levels(chip))) | 69 | if ((err = init_line_levels(chip))) |
70 | return err; | 70 | return err; |
71 | 71 | ||
72 | /* Default routing of the virtual channels: vchannels 0-3 go to analog | ||
73 | outputs and vchannels 4-7 go to S/PDIF outputs */ | ||
74 | set_vmixer_gain(chip, 0, 0, 0); | ||
75 | set_vmixer_gain(chip, 1, 1, 0); | ||
76 | set_vmixer_gain(chip, 0, 2, 0); | ||
77 | set_vmixer_gain(chip, 1, 3, 0); | ||
78 | set_vmixer_gain(chip, 2, 4, 0); | ||
79 | set_vmixer_gain(chip, 3, 5, 0); | ||
80 | set_vmixer_gain(chip, 2, 6, 0); | ||
81 | set_vmixer_gain(chip, 3, 7, 0); | ||
82 | err = update_vmixer_level(chip); | ||
83 | |||
84 | DE_INIT(("init_hw done\n")); | 72 | DE_INIT(("init_hw done\n")); |
85 | return err; | 73 | return err; |
86 | } | 74 | } |
@@ -222,10 +210,10 @@ static int set_professional_spdif(struct echoaudio *chip, char prof) | |||
222 | DE_ACT(("set_professional_spdif %d\n", prof)); | 210 | DE_ACT(("set_professional_spdif %d\n", prof)); |
223 | if (prof) | 211 | if (prof) |
224 | chip->comm_page->flags |= | 212 | chip->comm_page->flags |= |
225 | __constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 213 | cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
226 | else | 214 | else |
227 | chip->comm_page->flags &= | 215 | chip->comm_page->flags &= |
228 | ~__constant_cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); | 216 | ~cpu_to_le32(DSP_FLAG_PROFESSIONAL_SPDIF); |
229 | chip->professional_spdif = prof; | 217 | chip->professional_spdif = prof; |
230 | return update_flags(chip); | 218 | return update_flags(chip); |
231 | } | 219 | } |
diff --git a/sound/pci/echoaudio/midi.c b/sound/pci/echoaudio/midi.c index 77bf2a83d997..a953d142cb4b 100644 --- a/sound/pci/echoaudio/midi.c +++ b/sound/pci/echoaudio/midi.c | |||
@@ -44,10 +44,10 @@ static int enable_midi_input(struct echoaudio *chip, char enable) | |||
44 | if (enable) { | 44 | if (enable) { |
45 | chip->mtc_state = MIDI_IN_STATE_NORMAL; | 45 | chip->mtc_state = MIDI_IN_STATE_NORMAL; |
46 | chip->comm_page->flags |= | 46 | chip->comm_page->flags |= |
47 | __constant_cpu_to_le32(DSP_FLAG_MIDI_INPUT); | 47 | cpu_to_le32(DSP_FLAG_MIDI_INPUT); |
48 | } else | 48 | } else |
49 | chip->comm_page->flags &= | 49 | chip->comm_page->flags &= |
50 | ~__constant_cpu_to_le32(DSP_FLAG_MIDI_INPUT); | 50 | ~cpu_to_le32(DSP_FLAG_MIDI_INPUT); |
51 | 51 | ||
52 | clear_handshake(chip); | 52 | clear_handshake(chip); |
53 | return send_vector(chip, DSP_VC_UPDATE_FLAGS); | 53 | return send_vector(chip, DSP_VC_UPDATE_FLAGS); |
diff --git a/sound/pci/emu10k1/emu10k1_callback.c b/sound/pci/emu10k1/emu10k1_callback.c index 0e649dcdbf64..7ef949d99a50 100644 --- a/sound/pci/emu10k1/emu10k1_callback.c +++ b/sound/pci/emu10k1/emu10k1_callback.c | |||
@@ -103,7 +103,10 @@ snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw) | |||
103 | int ch; | 103 | int ch; |
104 | vp = &emu->voices[best[i].voice]; | 104 | vp = &emu->voices[best[i].voice]; |
105 | if ((ch = vp->ch) < 0) { | 105 | if ((ch = vp->ch) < 0) { |
106 | //printk("synth_get_voice: ch < 0 (%d) ??", i); | 106 | /* |
107 | printk(KERN_WARNING | ||
108 | "synth_get_voice: ch < 0 (%d) ??", i); | ||
109 | */ | ||
107 | continue; | 110 | continue; |
108 | } | 111 | } |
109 | vp->emu->num_voices--; | 112 | vp->emu->num_voices--; |
@@ -335,7 +338,7 @@ start_voice(struct snd_emux_voice *vp) | |||
335 | return -EINVAL; | 338 | return -EINVAL; |
336 | emem->map_locked++; | 339 | emem->map_locked++; |
337 | if (snd_emu10k1_memblk_map(hw, emem) < 0) { | 340 | if (snd_emu10k1_memblk_map(hw, emem) < 0) { |
338 | // printk("emu: cannot map!\n"); | 341 | /* printk(KERN_ERR "emu: cannot map!\n"); */ |
339 | return -ENOMEM; | 342 | return -ENOMEM; |
340 | } | 343 | } |
341 | mapped_offset = snd_emu10k1_memblk_offset(emem) >> 1; | 344 | mapped_offset = snd_emu10k1_memblk_offset(emem) >> 1; |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 7958006a1d66..f18bd6207c50 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
@@ -711,8 +711,7 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, const char *filena | |||
711 | static int emu1010_firmware_thread(void *data) | 711 | static int emu1010_firmware_thread(void *data) |
712 | { | 712 | { |
713 | struct snd_emu10k1 *emu = data; | 713 | struct snd_emu10k1 *emu = data; |
714 | int tmp, tmp2; | 714 | u32 tmp, tmp2, reg; |
715 | int reg; | ||
716 | int err; | 715 | int err; |
717 | 716 | ||
718 | for (;;) { | 717 | for (;;) { |
@@ -758,7 +757,8 @@ static int emu1010_firmware_thread(void *data) | |||
758 | snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n"); | 757 | snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n"); |
759 | snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp); | 758 | snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp); |
760 | snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2); | 759 | snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2); |
761 | snd_printk("Audio Dock ver:%d.%d\n", tmp, tmp2); | 760 | snd_printk(KERN_INFO "Audio Dock ver: %u.%u\n", |
761 | tmp, tmp2); | ||
762 | /* Sync clocking between 1010 and Dock */ | 762 | /* Sync clocking between 1010 and Dock */ |
763 | /* Allow DLL to settle */ | 763 | /* Allow DLL to settle */ |
764 | msleep(10); | 764 | msleep(10); |
@@ -804,8 +804,7 @@ static int emu1010_firmware_thread(void *data) | |||
804 | static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) | 804 | static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) |
805 | { | 805 | { |
806 | unsigned int i; | 806 | unsigned int i; |
807 | int tmp, tmp2; | 807 | u32 tmp, tmp2, reg; |
808 | int reg; | ||
809 | int err; | 808 | int err; |
810 | const char *filename = NULL; | 809 | const char *filename = NULL; |
811 | 810 | ||
@@ -887,7 +886,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) | |||
887 | snd_printk(KERN_INFO "emu1010: Hana Firmware loaded\n"); | 886 | snd_printk(KERN_INFO "emu1010: Hana Firmware loaded\n"); |
888 | snd_emu1010_fpga_read(emu, EMU_HANA_MAJOR_REV, &tmp); | 887 | snd_emu1010_fpga_read(emu, EMU_HANA_MAJOR_REV, &tmp); |
889 | snd_emu1010_fpga_read(emu, EMU_HANA_MINOR_REV, &tmp2); | 888 | snd_emu1010_fpga_read(emu, EMU_HANA_MINOR_REV, &tmp2); |
890 | snd_printk("emu1010: Hana version: %d.%d\n", tmp, tmp2); | 889 | snd_printk(KERN_INFO "emu1010: Hana version: %u.%u\n", tmp, tmp2); |
891 | /* Enable 48Volt power to Audio Dock */ | 890 | /* Enable 48Volt power to Audio Dock */ |
892 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, EMU_HANA_DOCK_PWR_ON); | 891 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, EMU_HANA_DOCK_PWR_ON); |
893 | 892 | ||
@@ -1528,6 +1527,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1528 | .ca0151_chip = 1, | 1527 | .ca0151_chip = 1, |
1529 | .spk71 = 1, | 1528 | .spk71 = 1, |
1530 | .spdif_bug = 1, | 1529 | .spdif_bug = 1, |
1530 | .invert_shared_spdif = 1, /* digital/analog switch swapped */ | ||
1531 | .ac97_chip = 1} , | 1531 | .ac97_chip = 1} , |
1532 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, | 1532 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, |
1533 | .driver = "Audigy2", .name = "SB Audigy 2 Platinum [SB0240P]", | 1533 | .driver = "Audigy2", .name = "SB Audigy 2 Platinum [SB0240P]", |
diff --git a/sound/pci/emu10k1/emu10k1x.c b/sound/pci/emu10k1/emu10k1x.c index 31542adc6b7e..1970f0e70f37 100644 --- a/sound/pci/emu10k1/emu10k1x.c +++ b/sound/pci/emu10k1/emu10k1x.c | |||
@@ -897,8 +897,8 @@ static int __devinit snd_emu10k1x_create(struct snd_card *card, | |||
897 | 897 | ||
898 | if ((err = pci_enable_device(pci)) < 0) | 898 | if ((err = pci_enable_device(pci)) < 0) |
899 | return err; | 899 | return err; |
900 | if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | 900 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 || |
901 | pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | 901 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { |
902 | snd_printk(KERN_ERR "error to set 28bit mask DMA\n"); | 902 | snd_printk(KERN_ERR "error to set 28bit mask DMA\n"); |
903 | pci_disable_device(pci); | 903 | pci_disable_device(pci); |
904 | return -ENXIO; | 904 | return -ENXIO; |
diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c index 7dba08f0ab8e..4b302d86f5f2 100644 --- a/sound/pci/emu10k1/emufx.c +++ b/sound/pci/emu10k1/emufx.c | |||
@@ -1519,7 +1519,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) | |||
1519 | /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */ | 1519 | /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */ |
1520 | if (emu->card_capabilities->emu_model) { | 1520 | if (emu->card_capabilities->emu_model) { |
1521 | /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */ | 1521 | /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */ |
1522 | snd_printk("EMU outputs on\n"); | 1522 | snd_printk(KERN_INFO "EMU outputs on\n"); |
1523 | for (z = 0; z < 8; z++) { | 1523 | for (z = 0; z < 8; z++) { |
1524 | if (emu->card_capabilities->ca0108_chip) { | 1524 | if (emu->card_capabilities->ca0108_chip) { |
1525 | A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000); | 1525 | A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000); |
@@ -1567,7 +1567,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) | |||
1567 | 1567 | ||
1568 | if (emu->card_capabilities->emu_model) { | 1568 | if (emu->card_capabilities->emu_model) { |
1569 | if (emu->card_capabilities->ca0108_chip) { | 1569 | if (emu->card_capabilities->ca0108_chip) { |
1570 | snd_printk("EMU2 inputs on\n"); | 1570 | snd_printk(KERN_INFO "EMU2 inputs on\n"); |
1571 | for (z = 0; z < 0x10; z++) { | 1571 | for (z = 0; z < 0x10; z++) { |
1572 | snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, | 1572 | snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, |
1573 | bit_shifter16, | 1573 | bit_shifter16, |
@@ -1575,10 +1575,13 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) | |||
1575 | A_FXBUS2(z*2) ); | 1575 | A_FXBUS2(z*2) ); |
1576 | } | 1576 | } |
1577 | } else { | 1577 | } else { |
1578 | snd_printk("EMU inputs on\n"); | 1578 | snd_printk(KERN_INFO "EMU inputs on\n"); |
1579 | /* Capture 16 (originally 8) channels of S32_LE sound */ | 1579 | /* Capture 16 (originally 8) channels of S32_LE sound */ |
1580 | 1580 | ||
1581 | /* printk("emufx.c: gpr=0x%x, tmp=0x%x\n",gpr, tmp); */ | 1581 | /* |
1582 | printk(KERN_DEBUG "emufx.c: gpr=0x%x, tmp=0x%x\n", | ||
1583 | gpr, tmp); | ||
1584 | */ | ||
1582 | /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */ | 1585 | /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */ |
1583 | /* A_P16VIN(0) is delayed by one sample, | 1586 | /* A_P16VIN(0) is delayed by one sample, |
1584 | * so all other A_P16VIN channels will need to also be delayed | 1587 | * so all other A_P16VIN channels will need to also be delayed |
@@ -2490,24 +2493,17 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un | |||
2490 | case SNDRV_EMU10K1_IOCTL_CODE_POKE: | 2493 | case SNDRV_EMU10K1_IOCTL_CODE_POKE: |
2491 | if (!capable(CAP_SYS_ADMIN)) | 2494 | if (!capable(CAP_SYS_ADMIN)) |
2492 | return -EPERM; | 2495 | return -EPERM; |
2493 | icode = kmalloc(sizeof(*icode), GFP_KERNEL); | 2496 | |
2494 | if (icode == NULL) | 2497 | icode = memdup_user(argp, sizeof(*icode)); |
2495 | return -ENOMEM; | 2498 | if (IS_ERR(icode)) |
2496 | if (copy_from_user(icode, argp, sizeof(*icode))) { | 2499 | return PTR_ERR(icode); |
2497 | kfree(icode); | ||
2498 | return -EFAULT; | ||
2499 | } | ||
2500 | res = snd_emu10k1_icode_poke(emu, icode); | 2500 | res = snd_emu10k1_icode_poke(emu, icode); |
2501 | kfree(icode); | 2501 | kfree(icode); |
2502 | return res; | 2502 | return res; |
2503 | case SNDRV_EMU10K1_IOCTL_CODE_PEEK: | 2503 | case SNDRV_EMU10K1_IOCTL_CODE_PEEK: |
2504 | icode = kmalloc(sizeof(*icode), GFP_KERNEL); | 2504 | icode = memdup_user(argp, sizeof(*icode)); |
2505 | if (icode == NULL) | 2505 | if (IS_ERR(icode)) |
2506 | return -ENOMEM; | 2506 | return PTR_ERR(icode); |
2507 | if (copy_from_user(icode, argp, sizeof(*icode))) { | ||
2508 | kfree(icode); | ||
2509 | return -EFAULT; | ||
2510 | } | ||
2511 | res = snd_emu10k1_icode_peek(emu, icode); | 2507 | res = snd_emu10k1_icode_peek(emu, icode); |
2512 | if (res == 0 && copy_to_user(argp, icode, sizeof(*icode))) { | 2508 | if (res == 0 && copy_to_user(argp, icode, sizeof(*icode))) { |
2513 | kfree(icode); | 2509 | kfree(icode); |
@@ -2516,24 +2512,16 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un | |||
2516 | kfree(icode); | 2512 | kfree(icode); |
2517 | return res; | 2513 | return res; |
2518 | case SNDRV_EMU10K1_IOCTL_PCM_POKE: | 2514 | case SNDRV_EMU10K1_IOCTL_PCM_POKE: |
2519 | ipcm = kmalloc(sizeof(*ipcm), GFP_KERNEL); | 2515 | ipcm = memdup_user(argp, sizeof(*ipcm)); |
2520 | if (ipcm == NULL) | 2516 | if (IS_ERR(ipcm)) |
2521 | return -ENOMEM; | 2517 | return PTR_ERR(ipcm); |
2522 | if (copy_from_user(ipcm, argp, sizeof(*ipcm))) { | ||
2523 | kfree(ipcm); | ||
2524 | return -EFAULT; | ||
2525 | } | ||
2526 | res = snd_emu10k1_ipcm_poke(emu, ipcm); | 2518 | res = snd_emu10k1_ipcm_poke(emu, ipcm); |
2527 | kfree(ipcm); | 2519 | kfree(ipcm); |
2528 | return res; | 2520 | return res; |
2529 | case SNDRV_EMU10K1_IOCTL_PCM_PEEK: | 2521 | case SNDRV_EMU10K1_IOCTL_PCM_PEEK: |
2530 | ipcm = kzalloc(sizeof(*ipcm), GFP_KERNEL); | 2522 | ipcm = memdup_user(argp, sizeof(*ipcm)); |
2531 | if (ipcm == NULL) | 2523 | if (IS_ERR(ipcm)) |
2532 | return -ENOMEM; | 2524 | return PTR_ERR(ipcm); |
2533 | if (copy_from_user(ipcm, argp, sizeof(*ipcm))) { | ||
2534 | kfree(ipcm); | ||
2535 | return -EFAULT; | ||
2536 | } | ||
2537 | res = snd_emu10k1_ipcm_peek(emu, ipcm); | 2525 | res = snd_emu10k1_ipcm_peek(emu, ipcm); |
2538 | if (res == 0 && copy_to_user(argp, ipcm, sizeof(*ipcm))) { | 2526 | if (res == 0 && copy_to_user(argp, ipcm, sizeof(*ipcm))) { |
2539 | kfree(ipcm); | 2527 | kfree(ipcm); |
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c index cf9276ddad42..78f62fd404c2 100644 --- a/sound/pci/emu10k1/emupcm.c +++ b/sound/pci/emu10k1/emupcm.c | |||
@@ -44,7 +44,7 @@ static void snd_emu10k1_pcm_interrupt(struct snd_emu10k1 *emu, | |||
44 | if (epcm->substream == NULL) | 44 | if (epcm->substream == NULL) |
45 | return; | 45 | return; |
46 | #if 0 | 46 | #if 0 |
47 | printk("IRQ: position = 0x%x, period = 0x%x, size = 0x%x\n", | 47 | printk(KERN_DEBUG "IRQ: position = 0x%x, period = 0x%x, size = 0x%x\n", |
48 | epcm->substream->runtime->hw->pointer(emu, epcm->substream), | 48 | epcm->substream->runtime->hw->pointer(emu, epcm->substream), |
49 | snd_pcm_lib_period_bytes(epcm->substream), | 49 | snd_pcm_lib_period_bytes(epcm->substream), |
50 | snd_pcm_lib_buffer_bytes(epcm->substream)); | 50 | snd_pcm_lib_buffer_bytes(epcm->substream)); |
@@ -146,7 +146,11 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic | |||
146 | 1, | 146 | 1, |
147 | &epcm->extra); | 147 | &epcm->extra); |
148 | if (err < 0) { | 148 | if (err < 0) { |
149 | /* printk("pcm_channel_alloc: failed extra: voices=%d, frame=%d\n", voices, frame); */ | 149 | /* |
150 | printk(KERN_DEBUG "pcm_channel_alloc: " | ||
151 | "failed extra: voices=%d, frame=%d\n", | ||
152 | voices, frame); | ||
153 | */ | ||
150 | for (i = 0; i < voices; i++) { | 154 | for (i = 0; i < voices; i++) { |
151 | snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]); | 155 | snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]); |
152 | epcm->voices[i] = NULL; | 156 | epcm->voices[i] = NULL; |
@@ -737,7 +741,10 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, | |||
737 | struct snd_emu10k1_pcm_mixer *mix; | 741 | struct snd_emu10k1_pcm_mixer *mix; |
738 | int result = 0; | 742 | int result = 0; |
739 | 743 | ||
740 | /* printk("trigger - emu10k1 = 0x%x, cmd = %i, pointer = %i\n", (int)emu, cmd, substream->ops->pointer(substream)); */ | 744 | /* |
745 | printk(KERN_DEBUG "trigger - emu10k1 = 0x%x, cmd = %i, pointer = %i\n", | ||
746 | (int)emu, cmd, substream->ops->pointer(substream)) | ||
747 | */ | ||
741 | spin_lock(&emu->reg_lock); | 748 | spin_lock(&emu->reg_lock); |
742 | switch (cmd) { | 749 | switch (cmd) { |
743 | case SNDRV_PCM_TRIGGER_START: | 750 | case SNDRV_PCM_TRIGGER_START: |
@@ -786,7 +793,10 @@ static int snd_emu10k1_capture_trigger(struct snd_pcm_substream *substream, | |||
786 | /* hmm this should cause full and half full interrupt to be raised? */ | 793 | /* hmm this should cause full and half full interrupt to be raised? */ |
787 | outl(epcm->capture_ipr, emu->port + IPR); | 794 | outl(epcm->capture_ipr, emu->port + IPR); |
788 | snd_emu10k1_intr_enable(emu, epcm->capture_inte); | 795 | snd_emu10k1_intr_enable(emu, epcm->capture_inte); |
789 | /* printk("adccr = 0x%x, adcbs = 0x%x\n", epcm->adccr, epcm->adcbs); */ | 796 | /* |
797 | printk(KERN_DEBUG "adccr = 0x%x, adcbs = 0x%x\n", | ||
798 | epcm->adccr, epcm->adcbs); | ||
799 | */ | ||
790 | switch (epcm->type) { | 800 | switch (epcm->type) { |
791 | case CAPTURE_AC97ADC: | 801 | case CAPTURE_AC97ADC: |
792 | snd_emu10k1_ptr_write(emu, ADCCR, 0, epcm->capture_cr_val); | 802 | snd_emu10k1_ptr_write(emu, ADCCR, 0, epcm->capture_cr_val); |
@@ -857,7 +867,11 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream * | |||
857 | ptr -= runtime->buffer_size; | 867 | ptr -= runtime->buffer_size; |
858 | } | 868 | } |
859 | #endif | 869 | #endif |
860 | /* printk("ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", ptr, runtime->buffer_size, runtime->period_size); */ | 870 | /* |
871 | printk(KERN_DEBUG | ||
872 | "ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", | ||
873 | ptr, runtime->buffer_size, runtime->period_size); | ||
874 | */ | ||
861 | return ptr; | 875 | return ptr; |
862 | } | 876 | } |
863 | 877 | ||
@@ -1546,7 +1560,11 @@ static void snd_emu10k1_fx8010_playback_tram_poke1(unsigned short *dst_left, | |||
1546 | unsigned int count, | 1560 | unsigned int count, |
1547 | unsigned int tram_shift) | 1561 | unsigned int tram_shift) |
1548 | { | 1562 | { |
1549 | /* printk("tram_poke1: dst_left = 0x%p, dst_right = 0x%p, src = 0x%p, count = 0x%x\n", dst_left, dst_right, src, count); */ | 1563 | /* |
1564 | printk(KERN_DEBUG "tram_poke1: dst_left = 0x%p, dst_right = 0x%p, " | ||
1565 | "src = 0x%p, count = 0x%x\n", | ||
1566 | dst_left, dst_right, src, count); | ||
1567 | */ | ||
1550 | if ((tram_shift & 1) == 0) { | 1568 | if ((tram_shift & 1) == 0) { |
1551 | while (count--) { | 1569 | while (count--) { |
1552 | *dst_left-- = *src++; | 1570 | *dst_left-- = *src++; |
@@ -1623,7 +1641,12 @@ static int snd_emu10k1_fx8010_playback_prepare(struct snd_pcm_substream *substre | |||
1623 | struct snd_emu10k1_fx8010_pcm *pcm = &emu->fx8010.pcm[substream->number]; | 1641 | struct snd_emu10k1_fx8010_pcm *pcm = &emu->fx8010.pcm[substream->number]; |
1624 | unsigned int i; | 1642 | unsigned int i; |
1625 | 1643 | ||
1626 | /* printk("prepare: etram_pages = 0x%p, dma_area = 0x%x, buffer_size = 0x%x (0x%x)\n", emu->fx8010.etram_pages, runtime->dma_area, runtime->buffer_size, runtime->buffer_size << 2); */ | 1644 | /* |
1645 | printk(KERN_DEBUG "prepare: etram_pages = 0x%p, dma_area = 0x%x, " | ||
1646 | "buffer_size = 0x%x (0x%x)\n", | ||
1647 | emu->fx8010.etram_pages, runtime->dma_area, | ||
1648 | runtime->buffer_size, runtime->buffer_size << 2); | ||
1649 | */ | ||
1627 | memset(&pcm->pcm_rec, 0, sizeof(pcm->pcm_rec)); | 1650 | memset(&pcm->pcm_rec, 0, sizeof(pcm->pcm_rec)); |
1628 | pcm->pcm_rec.hw_buffer_size = pcm->buffer_size * 2; /* byte size */ | 1651 | pcm->pcm_rec.hw_buffer_size = pcm->buffer_size * 2; /* byte size */ |
1629 | pcm->pcm_rec.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream); | 1652 | pcm->pcm_rec.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream); |
diff --git a/sound/pci/emu10k1/io.c b/sound/pci/emu10k1/io.c index b5a802bdeb7c..c1a5aa15af8f 100644 --- a/sound/pci/emu10k1/io.c +++ b/sound/pci/emu10k1/io.c | |||
@@ -226,7 +226,9 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, | |||
226 | break; | 226 | break; |
227 | 227 | ||
228 | if (timeout > 1000) { | 228 | if (timeout > 1000) { |
229 | snd_printk("emu10k1:I2C:timeout status=0x%x\n", status); | 229 | snd_printk(KERN_WARNING |
230 | "emu10k1:I2C:timeout status=0x%x\n", | ||
231 | status); | ||
230 | break; | 232 | break; |
231 | } | 233 | } |
232 | } | 234 | } |
@@ -488,7 +490,7 @@ void snd_emu10k1_wait(struct snd_emu10k1 *emu, unsigned int wait) | |||
488 | if (newtime != curtime) | 490 | if (newtime != curtime) |
489 | break; | 491 | break; |
490 | } | 492 | } |
491 | if (count >= 16384) | 493 | if (count > 16384) |
492 | break; | 494 | break; |
493 | curtime = newtime; | 495 | curtime = newtime; |
494 | } | 496 | } |
diff --git a/sound/pci/emu10k1/p16v.c b/sound/pci/emu10k1/p16v.c index 749a21b6bd06..e617acaf10e3 100644 --- a/sound/pci/emu10k1/p16v.c +++ b/sound/pci/emu10k1/p16v.c | |||
@@ -168,7 +168,7 @@ static void snd_p16v_pcm_free_substream(struct snd_pcm_runtime *runtime) | |||
168 | struct snd_emu10k1_pcm *epcm = runtime->private_data; | 168 | struct snd_emu10k1_pcm *epcm = runtime->private_data; |
169 | 169 | ||
170 | if (epcm) { | 170 | if (epcm) { |
171 | //snd_printk("epcm free: %p\n", epcm); | 171 | /* snd_printk(KERN_DEBUG "epcm free: %p\n", epcm); */ |
172 | kfree(epcm); | 172 | kfree(epcm); |
173 | } | 173 | } |
174 | } | 174 | } |
@@ -183,14 +183,16 @@ static int snd_p16v_pcm_open_playback_channel(struct snd_pcm_substream *substrea | |||
183 | int err; | 183 | int err; |
184 | 184 | ||
185 | epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); | 185 | epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); |
186 | //snd_printk("epcm kcalloc: %p\n", epcm); | 186 | /* snd_printk(KERN_DEBUG "epcm kcalloc: %p\n", epcm); */ |
187 | 187 | ||
188 | if (epcm == NULL) | 188 | if (epcm == NULL) |
189 | return -ENOMEM; | 189 | return -ENOMEM; |
190 | epcm->emu = emu; | 190 | epcm->emu = emu; |
191 | epcm->substream = substream; | 191 | epcm->substream = substream; |
192 | //snd_printk("epcm device=%d, channel_id=%d\n", substream->pcm->device, channel_id); | 192 | /* |
193 | 193 | snd_printk(KERN_DEBUG "epcm device=%d, channel_id=%d\n", | |
194 | substream->pcm->device, channel_id); | ||
195 | */ | ||
194 | runtime->private_data = epcm; | 196 | runtime->private_data = epcm; |
195 | runtime->private_free = snd_p16v_pcm_free_substream; | 197 | runtime->private_free = snd_p16v_pcm_free_substream; |
196 | 198 | ||
@@ -200,10 +202,15 @@ static int snd_p16v_pcm_open_playback_channel(struct snd_pcm_substream *substrea | |||
200 | channel->number = channel_id; | 202 | channel->number = channel_id; |
201 | 203 | ||
202 | channel->use=1; | 204 | channel->use=1; |
203 | //snd_printk("p16v: open channel_id=%d, channel=%p, use=0x%x\n", channel_id, channel, channel->use); | 205 | #if 0 /* debug */ |
204 | //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); | 206 | snd_printk(KERN_DEBUG |
205 | //channel->interrupt = snd_p16v_pcm_channel_interrupt; | 207 | "p16v: open channel_id=%d, channel=%p, use=0x%x\n", |
206 | channel->epcm=epcm; | 208 | channel_id, channel, channel->use); |
209 | printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n", | ||
210 | channel_id, chip, channel); | ||
211 | #endif /* debug */ | ||
212 | /* channel->interrupt = snd_p16v_pcm_channel_interrupt; */ | ||
213 | channel->epcm = epcm; | ||
207 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 214 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
208 | return err; | 215 | return err; |
209 | 216 | ||
@@ -224,14 +231,16 @@ static int snd_p16v_pcm_open_capture_channel(struct snd_pcm_substream *substream | |||
224 | int err; | 231 | int err; |
225 | 232 | ||
226 | epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); | 233 | epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); |
227 | //snd_printk("epcm kcalloc: %p\n", epcm); | 234 | /* snd_printk(KERN_DEBUG "epcm kcalloc: %p\n", epcm); */ |
228 | 235 | ||
229 | if (epcm == NULL) | 236 | if (epcm == NULL) |
230 | return -ENOMEM; | 237 | return -ENOMEM; |
231 | epcm->emu = emu; | 238 | epcm->emu = emu; |
232 | epcm->substream = substream; | 239 | epcm->substream = substream; |
233 | //snd_printk("epcm device=%d, channel_id=%d\n", substream->pcm->device, channel_id); | 240 | /* |
234 | 241 | snd_printk(KERN_DEBUG "epcm device=%d, channel_id=%d\n", | |
242 | substream->pcm->device, channel_id); | ||
243 | */ | ||
235 | runtime->private_data = epcm; | 244 | runtime->private_data = epcm; |
236 | runtime->private_free = snd_p16v_pcm_free_substream; | 245 | runtime->private_free = snd_p16v_pcm_free_substream; |
237 | 246 | ||
@@ -241,10 +250,15 @@ static int snd_p16v_pcm_open_capture_channel(struct snd_pcm_substream *substream | |||
241 | channel->number = channel_id; | 250 | channel->number = channel_id; |
242 | 251 | ||
243 | channel->use=1; | 252 | channel->use=1; |
244 | //snd_printk("p16v: open channel_id=%d, channel=%p, use=0x%x\n", channel_id, channel, channel->use); | 253 | #if 0 /* debug */ |
245 | //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); | 254 | snd_printk(KERN_DEBUG |
246 | //channel->interrupt = snd_p16v_pcm_channel_interrupt; | 255 | "p16v: open channel_id=%d, channel=%p, use=0x%x\n", |
247 | channel->epcm=epcm; | 256 | channel_id, channel, channel->use); |
257 | printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n", | ||
258 | channel_id, chip, channel); | ||
259 | #endif /* debug */ | ||
260 | /* channel->interrupt = snd_p16v_pcm_channel_interrupt; */ | ||
261 | channel->epcm = epcm; | ||
248 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 262 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
249 | return err; | 263 | return err; |
250 | 264 | ||
@@ -334,9 +348,19 @@ static int snd_p16v_pcm_prepare_playback(struct snd_pcm_substream *substream) | |||
334 | int i; | 348 | int i; |
335 | u32 tmp; | 349 | u32 tmp; |
336 | 350 | ||
337 | //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1)); | 351 | #if 0 /* debug */ |
338 | //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); | 352 | snd_printk(KERN_DEBUG "prepare:channel_number=%d, rate=%d, " |
339 | //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->p16v_buffer.addr, emu->p16v_buffer.area, emu->p16v_buffer.bytes); | 353 | "format=0x%x, channels=%d, buffer_size=%ld, " |
354 | "period_size=%ld, periods=%u, frames_to_bytes=%d\n", | ||
355 | channel, runtime->rate, runtime->format, runtime->channels, | ||
356 | runtime->buffer_size, runtime->period_size, | ||
357 | runtime->periods, frames_to_bytes(runtime, 1)); | ||
358 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p\n", | ||
359 | runtime->dma_addr, runtime->dma_area, table_base); | ||
360 | snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", | ||
361 | emu->p16v_buffer.addr, emu->p16v_buffer.area, | ||
362 | emu->p16v_buffer.bytes); | ||
363 | #endif /* debug */ | ||
340 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); | 364 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); |
341 | switch (runtime->rate) { | 365 | switch (runtime->rate) { |
342 | case 44100: | 366 | case 44100: |
@@ -379,7 +403,15 @@ static int snd_p16v_pcm_prepare_capture(struct snd_pcm_substream *substream) | |||
379 | struct snd_pcm_runtime *runtime = substream->runtime; | 403 | struct snd_pcm_runtime *runtime = substream->runtime; |
380 | int channel = substream->pcm->device - emu->p16v_device_offset; | 404 | int channel = substream->pcm->device - emu->p16v_device_offset; |
381 | u32 tmp; | 405 | u32 tmp; |
382 | //printk("prepare capture:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, frames_to_bytes(runtime, 1)); | 406 | |
407 | /* | ||
408 | printk(KERN_DEBUG "prepare capture:channel_number=%d, rate=%d, " | ||
409 | "format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, " | ||
410 | "frames_to_bytes=%d\n", | ||
411 | channel, runtime->rate, runtime->format, runtime->channels, | ||
412 | runtime->buffer_size, runtime->period_size, | ||
413 | frames_to_bytes(runtime, 1)); | ||
414 | */ | ||
383 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); | 415 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); |
384 | switch (runtime->rate) { | 416 | switch (runtime->rate) { |
385 | case 44100: | 417 | case 44100: |
@@ -459,13 +491,13 @@ static int snd_p16v_pcm_trigger_playback(struct snd_pcm_substream *substream, | |||
459 | runtime = s->runtime; | 491 | runtime = s->runtime; |
460 | epcm = runtime->private_data; | 492 | epcm = runtime->private_data; |
461 | channel = substream->pcm->device-emu->p16v_device_offset; | 493 | channel = substream->pcm->device-emu->p16v_device_offset; |
462 | //snd_printk("p16v channel=%d\n",channel); | 494 | /* snd_printk(KERN_DEBUG "p16v channel=%d\n", channel); */ |
463 | epcm->running = running; | 495 | epcm->running = running; |
464 | basic |= (0x1<<channel); | 496 | basic |= (0x1<<channel); |
465 | inte |= (INTE2_PLAYBACK_CH_0_LOOP<<channel); | 497 | inte |= (INTE2_PLAYBACK_CH_0_LOOP<<channel); |
466 | snd_pcm_trigger_done(s, substream); | 498 | snd_pcm_trigger_done(s, substream); |
467 | } | 499 | } |
468 | //snd_printk("basic=0x%x, inte=0x%x\n",basic, inte); | 500 | /* snd_printk(KERN_DEBUG "basic=0x%x, inte=0x%x\n", basic, inte); */ |
469 | 501 | ||
470 | switch (cmd) { | 502 | switch (cmd) { |
471 | case SNDRV_PCM_TRIGGER_START: | 503 | case SNDRV_PCM_TRIGGER_START: |
@@ -558,8 +590,13 @@ snd_p16v_pcm_pointer_capture(struct snd_pcm_substream *substream) | |||
558 | ptr -= runtime->buffer_size; | 590 | ptr -= runtime->buffer_size; |
559 | printk(KERN_WARNING "buffer capture limited!\n"); | 591 | printk(KERN_WARNING "buffer capture limited!\n"); |
560 | } | 592 | } |
561 | //printk("ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate); | 593 | /* |
562 | 594 | printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, " | |
595 | "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", | ||
596 | ptr1, ptr2, ptr, (int)runtime->buffer_size, | ||
597 | (int)runtime->period_size, (int)runtime->frame_bits, | ||
598 | (int)runtime->rate); | ||
599 | */ | ||
563 | return ptr; | 600 | return ptr; |
564 | } | 601 | } |
565 | 602 | ||
@@ -592,7 +629,10 @@ int snd_p16v_free(struct snd_emu10k1 *chip) | |||
592 | // release the data | 629 | // release the data |
593 | if (chip->p16v_buffer.area) { | 630 | if (chip->p16v_buffer.area) { |
594 | snd_dma_free_pages(&chip->p16v_buffer); | 631 | snd_dma_free_pages(&chip->p16v_buffer); |
595 | //snd_printk("period lables free: %p\n", &chip->p16v_buffer); | 632 | /* |
633 | snd_printk(KERN_DEBUG "period lables free: %p\n", | ||
634 | &chip->p16v_buffer); | ||
635 | */ | ||
596 | } | 636 | } |
597 | return 0; | 637 | return 0; |
598 | } | 638 | } |
@@ -604,7 +644,7 @@ int __devinit snd_p16v_pcm(struct snd_emu10k1 *emu, int device, struct snd_pcm * | |||
604 | int err; | 644 | int err; |
605 | int capture=1; | 645 | int capture=1; |
606 | 646 | ||
607 | //snd_printk("snd_p16v_pcm called. device=%d\n", device); | 647 | /* snd_printk("KERN_DEBUG snd_p16v_pcm called. device=%d\n", device); */ |
608 | emu->p16v_device_offset = device; | 648 | emu->p16v_device_offset = device; |
609 | if (rpcm) | 649 | if (rpcm) |
610 | *rpcm = NULL; | 650 | *rpcm = NULL; |
@@ -631,7 +671,10 @@ int __devinit snd_p16v_pcm(struct snd_emu10k1 *emu, int device, struct snd_pcm * | |||
631 | snd_dma_pci_data(emu->pci), | 671 | snd_dma_pci_data(emu->pci), |
632 | ((65536 - 64) * 8), ((65536 - 64) * 8))) < 0) | 672 | ((65536 - 64) * 8), ((65536 - 64) * 8))) < 0) |
633 | return err; | 673 | return err; |
634 | //snd_printk("preallocate playback substream: err=%d\n", err); | 674 | /* |
675 | snd_printk(KERN_DEBUG | ||
676 | "preallocate playback substream: err=%d\n", err); | ||
677 | */ | ||
635 | } | 678 | } |
636 | 679 | ||
637 | for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; | 680 | for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; |
@@ -642,7 +685,10 @@ int __devinit snd_p16v_pcm(struct snd_emu10k1 *emu, int device, struct snd_pcm * | |||
642 | snd_dma_pci_data(emu->pci), | 685 | snd_dma_pci_data(emu->pci), |
643 | 65536 - 64, 65536 - 64)) < 0) | 686 | 65536 - 64, 65536 - 64)) < 0) |
644 | return err; | 687 | return err; |
645 | //snd_printk("preallocate capture substream: err=%d\n", err); | 688 | /* |
689 | snd_printk(KERN_DEBUG | ||
690 | "preallocate capture substream: err=%d\n", err); | ||
691 | */ | ||
646 | } | 692 | } |
647 | 693 | ||
648 | if (rpcm) | 694 | if (rpcm) |
diff --git a/sound/pci/emu10k1/voice.c b/sound/pci/emu10k1/voice.c index d7300a1aa262..20b8da250bd0 100644 --- a/sound/pci/emu10k1/voice.c +++ b/sound/pci/emu10k1/voice.c | |||
@@ -53,7 +53,10 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number, | |||
53 | *rvoice = NULL; | 53 | *rvoice = NULL; |
54 | first_voice = last_voice = 0; | 54 | first_voice = last_voice = 0; |
55 | for (i = emu->next_free_voice, j = 0; j < NUM_G ; i += number, j += number) { | 55 | for (i = emu->next_free_voice, j = 0; j < NUM_G ; i += number, j += number) { |
56 | // printk("i %d j %d next free %d!\n", i, j, emu->next_free_voice); | 56 | /* |
57 | printk(KERN_DEBUG "i %d j %d next free %d!\n", | ||
58 | i, j, emu->next_free_voice); | ||
59 | */ | ||
57 | i %= NUM_G; | 60 | i %= NUM_G; |
58 | 61 | ||
59 | /* stereo voices must be even/odd */ | 62 | /* stereo voices must be even/odd */ |
@@ -71,7 +74,7 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number, | |||
71 | } | 74 | } |
72 | } | 75 | } |
73 | if (!skip) { | 76 | if (!skip) { |
74 | // printk("allocated voice %d\n", i); | 77 | /* printk(KERN_DEBUG "allocated voice %d\n", i); */ |
75 | first_voice = i; | 78 | first_voice = i; |
76 | last_voice = (i + number) % NUM_G; | 79 | last_voice = (i + number) % NUM_G; |
77 | emu->next_free_voice = last_voice; | 80 | emu->next_free_voice = last_voice; |
@@ -84,7 +87,10 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number, | |||
84 | 87 | ||
85 | for (i = 0; i < number; i++) { | 88 | for (i = 0; i < number; i++) { |
86 | voice = &emu->voices[(first_voice + i) % NUM_G]; | 89 | voice = &emu->voices[(first_voice + i) % NUM_G]; |
87 | // printk("voice alloc - %i, %i of %i\n", voice->number, idx-first_voice+1, number); | 90 | /* |
91 | printk(kERN_DEBUG "voice alloc - %i, %i of %i\n", | ||
92 | voice->number, idx-first_voice+1, number); | ||
93 | */ | ||
88 | voice->use = 1; | 94 | voice->use = 1; |
89 | switch (type) { | 95 | switch (type) { |
90 | case EMU10K1_PCM: | 96 | case EMU10K1_PCM: |
diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index e00614cbceff..18f4d1e98c46 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c | |||
@@ -584,7 +584,8 @@ static void snd_es1370_codec_write(struct snd_ak4531 *ak4531, | |||
584 | unsigned long end_time = jiffies + HZ / 10; | 584 | unsigned long end_time = jiffies + HZ / 10; |
585 | 585 | ||
586 | #if 0 | 586 | #if 0 |
587 | printk("CODEC WRITE: reg = 0x%x, val = 0x%x (0x%x), creg = 0x%x\n", | 587 | printk(KERN_DEBUG |
588 | "CODEC WRITE: reg = 0x%x, val = 0x%x (0x%x), creg = 0x%x\n", | ||
588 | reg, val, ES_1370_CODEC_WRITE(reg, val), ES_REG(ensoniq, 1370_CODEC)); | 589 | reg, val, ES_1370_CODEC_WRITE(reg, val), ES_REG(ensoniq, 1370_CODEC)); |
589 | #endif | 590 | #endif |
590 | do { | 591 | do { |
diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 34a78afc26d0..fbd2ac09aa34 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c | |||
@@ -1608,8 +1608,8 @@ static int __devinit snd_es1938_create(struct snd_card *card, | |||
1608 | if ((err = pci_enable_device(pci)) < 0) | 1608 | if ((err = pci_enable_device(pci)) < 0) |
1609 | return err; | 1609 | return err; |
1610 | /* check, if we can restrict PCI DMA transfers to 24 bits */ | 1610 | /* check, if we can restrict PCI DMA transfers to 24 bits */ |
1611 | if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || | 1611 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 || |
1612 | pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { | 1612 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) { |
1613 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); | 1613 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); |
1614 | pci_disable_device(pci); | 1614 | pci_disable_device(pci); |
1615 | return -ENXIO; | 1615 | return -ENXIO; |
@@ -1673,18 +1673,22 @@ static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id) | |||
1673 | 1673 | ||
1674 | status = inb(SLIO_REG(chip, IRQCONTROL)); | 1674 | status = inb(SLIO_REG(chip, IRQCONTROL)); |
1675 | #if 0 | 1675 | #if 0 |
1676 | printk("Es1938debug - interrupt status: =0x%x\n", status); | 1676 | printk(KERN_DEBUG "Es1938debug - interrupt status: =0x%x\n", status); |
1677 | #endif | 1677 | #endif |
1678 | 1678 | ||
1679 | /* AUDIO 1 */ | 1679 | /* AUDIO 1 */ |
1680 | if (status & 0x10) { | 1680 | if (status & 0x10) { |
1681 | #if 0 | 1681 | #if 0 |
1682 | printk("Es1938debug - AUDIO channel 1 interrupt\n"); | 1682 | printk(KERN_DEBUG |
1683 | printk("Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n", | 1683 | "Es1938debug - AUDIO channel 1 interrupt\n"); |
1684 | printk(KERN_DEBUG | ||
1685 | "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n", | ||
1684 | inw(SLDM_REG(chip, DMACOUNT))); | 1686 | inw(SLDM_REG(chip, DMACOUNT))); |
1685 | printk("Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n", | 1687 | printk(KERN_DEBUG |
1688 | "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n", | ||
1686 | inl(SLDM_REG(chip, DMAADDR))); | 1689 | inl(SLDM_REG(chip, DMAADDR))); |
1687 | printk("Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", | 1690 | printk(KERN_DEBUG |
1691 | "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", | ||
1688 | inl(SLDM_REG(chip, DMASTATUS))); | 1692 | inl(SLDM_REG(chip, DMASTATUS))); |
1689 | #endif | 1693 | #endif |
1690 | /* clear irq */ | 1694 | /* clear irq */ |
@@ -1699,10 +1703,13 @@ static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id) | |||
1699 | /* AUDIO 2 */ | 1703 | /* AUDIO 2 */ |
1700 | if (status & 0x20) { | 1704 | if (status & 0x20) { |
1701 | #if 0 | 1705 | #if 0 |
1702 | printk("Es1938debug - AUDIO channel 2 interrupt\n"); | 1706 | printk(KERN_DEBUG |
1703 | printk("Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n", | 1707 | "Es1938debug - AUDIO channel 2 interrupt\n"); |
1708 | printk(KERN_DEBUG | ||
1709 | "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n", | ||
1704 | inw(SLIO_REG(chip, AUDIO2DMACOUNT))); | 1710 | inw(SLIO_REG(chip, AUDIO2DMACOUNT))); |
1705 | printk("Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n", | 1711 | printk(KERN_DEBUG |
1712 | "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n", | ||
1706 | inl(SLIO_REG(chip, AUDIO2DMAADDR))); | 1713 | inl(SLIO_REG(chip, AUDIO2DMAADDR))); |
1707 | 1714 | ||
1708 | #endif | 1715 | #endif |
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index dc97e8116141..a11f453a6b6d 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -2539,8 +2539,8 @@ static int __devinit snd_es1968_create(struct snd_card *card, | |||
2539 | if ((err = pci_enable_device(pci)) < 0) | 2539 | if ((err = pci_enable_device(pci)) < 0) |
2540 | return err; | 2540 | return err; |
2541 | /* check, if we can restrict PCI DMA transfers to 28 bits */ | 2541 | /* check, if we can restrict PCI DMA transfers to 28 bits */ |
2542 | if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | 2542 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 || |
2543 | pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | 2543 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { |
2544 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); | 2544 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); |
2545 | pci_disable_device(pci); | 2545 | pci_disable_device(pci); |
2546 | return -ENXIO; | 2546 | return -ENXIO; |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 960fd7970384..4de5bacd3929 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
@@ -138,6 +138,7 @@ void snd_hda_detach_beep_device(struct hda_codec *codec) | |||
138 | 138 | ||
139 | input_unregister_device(beep->dev); | 139 | input_unregister_device(beep->dev); |
140 | kfree(beep); | 140 | kfree(beep); |
141 | codec->beep = NULL; | ||
141 | } | 142 | } |
142 | } | 143 | } |
143 | EXPORT_SYMBOL_HDA(snd_hda_detach_beep_device); | 144 | EXPORT_SYMBOL_HDA(snd_hda_detach_beep_device); |
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h index b9679f081cae..51bf6a5daf39 100644 --- a/sound/pci/hda/hda_beep.h +++ b/sound/pci/hda/hda_beep.h | |||
@@ -39,7 +39,7 @@ struct hda_beep { | |||
39 | int snd_hda_attach_beep_device(struct hda_codec *codec, int nid); | 39 | int snd_hda_attach_beep_device(struct hda_codec *codec, int nid); |
40 | void snd_hda_detach_beep_device(struct hda_codec *codec); | 40 | void snd_hda_detach_beep_device(struct hda_codec *codec); |
41 | #else | 41 | #else |
42 | #define snd_hda_attach_beep_device(...) | 42 | #define snd_hda_attach_beep_device(...) 0 |
43 | #define snd_hda_detach_beep_device(...) | 43 | #define snd_hda_detach_beep_device(...) |
44 | #endif | 44 | #endif |
45 | #endif | 45 | #endif |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 3c596da2b9b5..8820faf6c9d8 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -487,7 +487,6 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card, | |||
487 | { | 487 | { |
488 | struct hda_bus *bus; | 488 | struct hda_bus *bus; |
489 | int err; | 489 | int err; |
490 | char qname[8]; | ||
491 | static struct snd_device_ops dev_ops = { | 490 | static struct snd_device_ops dev_ops = { |
492 | .dev_register = snd_hda_bus_dev_register, | 491 | .dev_register = snd_hda_bus_dev_register, |
493 | .dev_free = snd_hda_bus_dev_free, | 492 | .dev_free = snd_hda_bus_dev_free, |
@@ -517,10 +516,12 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card, | |||
517 | mutex_init(&bus->cmd_mutex); | 516 | mutex_init(&bus->cmd_mutex); |
518 | INIT_LIST_HEAD(&bus->codec_list); | 517 | INIT_LIST_HEAD(&bus->codec_list); |
519 | 518 | ||
520 | snprintf(qname, sizeof(qname), "hda%d", card->number); | 519 | snprintf(bus->workq_name, sizeof(bus->workq_name), |
521 | bus->workq = create_workqueue(qname); | 520 | "hd-audio%d", card->number); |
521 | bus->workq = create_singlethread_workqueue(bus->workq_name); | ||
522 | if (!bus->workq) { | 522 | if (!bus->workq) { |
523 | snd_printk(KERN_ERR "cannot create workqueue %s\n", qname); | 523 | snd_printk(KERN_ERR "cannot create workqueue %s\n", |
524 | bus->workq_name); | ||
524 | kfree(bus); | 525 | kfree(bus); |
525 | return -ENOMEM; | 526 | return -ENOMEM; |
526 | } | 527 | } |
@@ -641,19 +642,21 @@ static int get_codec_name(struct hda_codec *codec) | |||
641 | */ | 642 | */ |
642 | static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) | 643 | static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) |
643 | { | 644 | { |
644 | int i, total_nodes; | 645 | int i, total_nodes, function_id; |
645 | hda_nid_t nid; | 646 | hda_nid_t nid; |
646 | 647 | ||
647 | total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); | 648 | total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); |
648 | for (i = 0; i < total_nodes; i++, nid++) { | 649 | for (i = 0; i < total_nodes; i++, nid++) { |
649 | unsigned int func; | 650 | function_id = snd_hda_param_read(codec, nid, |
650 | func = snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE); | 651 | AC_PAR_FUNCTION_TYPE) & 0xff; |
651 | switch (func & 0xff) { | 652 | switch (function_id) { |
652 | case AC_GRP_AUDIO_FUNCTION: | 653 | case AC_GRP_AUDIO_FUNCTION: |
653 | codec->afg = nid; | 654 | codec->afg = nid; |
655 | codec->function_id = function_id; | ||
654 | break; | 656 | break; |
655 | case AC_GRP_MODEM_FUNCTION: | 657 | case AC_GRP_MODEM_FUNCTION: |
656 | codec->mfg = nid; | 658 | codec->mfg = nid; |
659 | codec->function_id = function_id; | ||
657 | break; | 660 | break; |
658 | default: | 661 | default: |
659 | break; | 662 | break; |
@@ -681,11 +684,140 @@ static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) | |||
681 | return 0; | 684 | return 0; |
682 | } | 685 | } |
683 | 686 | ||
687 | /* read all pin default configurations and save codec->init_pins */ | ||
688 | static int read_pin_defaults(struct hda_codec *codec) | ||
689 | { | ||
690 | int i; | ||
691 | hda_nid_t nid = codec->start_nid; | ||
692 | |||
693 | for (i = 0; i < codec->num_nodes; i++, nid++) { | ||
694 | struct hda_pincfg *pin; | ||
695 | unsigned int wcaps = get_wcaps(codec, nid); | ||
696 | unsigned int wid_type = (wcaps & AC_WCAP_TYPE) >> | ||
697 | AC_WCAP_TYPE_SHIFT; | ||
698 | if (wid_type != AC_WID_PIN) | ||
699 | continue; | ||
700 | pin = snd_array_new(&codec->init_pins); | ||
701 | if (!pin) | ||
702 | return -ENOMEM; | ||
703 | pin->nid = nid; | ||
704 | pin->cfg = snd_hda_codec_read(codec, nid, 0, | ||
705 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
706 | } | ||
707 | return 0; | ||
708 | } | ||
709 | |||
710 | /* look up the given pin config list and return the item matching with NID */ | ||
711 | static struct hda_pincfg *look_up_pincfg(struct hda_codec *codec, | ||
712 | struct snd_array *array, | ||
713 | hda_nid_t nid) | ||
714 | { | ||
715 | int i; | ||
716 | for (i = 0; i < array->used; i++) { | ||
717 | struct hda_pincfg *pin = snd_array_elem(array, i); | ||
718 | if (pin->nid == nid) | ||
719 | return pin; | ||
720 | } | ||
721 | return NULL; | ||
722 | } | ||
723 | |||
724 | /* write a config value for the given NID */ | ||
725 | static void set_pincfg(struct hda_codec *codec, hda_nid_t nid, | ||
726 | unsigned int cfg) | ||
727 | { | ||
728 | int i; | ||
729 | for (i = 0; i < 4; i++) { | ||
730 | snd_hda_codec_write(codec, nid, 0, | ||
731 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 + i, | ||
732 | cfg & 0xff); | ||
733 | cfg >>= 8; | ||
734 | } | ||
735 | } | ||
736 | |||
737 | /* set the current pin config value for the given NID. | ||
738 | * the value is cached, and read via snd_hda_codec_get_pincfg() | ||
739 | */ | ||
740 | int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list, | ||
741 | hda_nid_t nid, unsigned int cfg) | ||
742 | { | ||
743 | struct hda_pincfg *pin; | ||
744 | unsigned int oldcfg; | ||
745 | |||
746 | oldcfg = snd_hda_codec_get_pincfg(codec, nid); | ||
747 | pin = look_up_pincfg(codec, list, nid); | ||
748 | if (!pin) { | ||
749 | pin = snd_array_new(list); | ||
750 | if (!pin) | ||
751 | return -ENOMEM; | ||
752 | pin->nid = nid; | ||
753 | } | ||
754 | pin->cfg = cfg; | ||
755 | |||
756 | /* change only when needed; e.g. if the pincfg is already present | ||
757 | * in user_pins[], don't write it | ||
758 | */ | ||
759 | cfg = snd_hda_codec_get_pincfg(codec, nid); | ||
760 | if (oldcfg != cfg) | ||
761 | set_pincfg(codec, nid, cfg); | ||
762 | return 0; | ||
763 | } | ||
764 | |||
765 | int snd_hda_codec_set_pincfg(struct hda_codec *codec, | ||
766 | hda_nid_t nid, unsigned int cfg) | ||
767 | { | ||
768 | return snd_hda_add_pincfg(codec, &codec->driver_pins, nid, cfg); | ||
769 | } | ||
770 | EXPORT_SYMBOL_HDA(snd_hda_codec_set_pincfg); | ||
771 | |||
772 | /* get the current pin config value of the given pin NID */ | ||
773 | unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) | ||
774 | { | ||
775 | struct hda_pincfg *pin; | ||
776 | |||
777 | #ifdef CONFIG_SND_HDA_HWDEP | ||
778 | pin = look_up_pincfg(codec, &codec->user_pins, nid); | ||
779 | if (pin) | ||
780 | return pin->cfg; | ||
781 | #endif | ||
782 | pin = look_up_pincfg(codec, &codec->driver_pins, nid); | ||
783 | if (pin) | ||
784 | return pin->cfg; | ||
785 | pin = look_up_pincfg(codec, &codec->init_pins, nid); | ||
786 | if (pin) | ||
787 | return pin->cfg; | ||
788 | return 0; | ||
789 | } | ||
790 | EXPORT_SYMBOL_HDA(snd_hda_codec_get_pincfg); | ||
791 | |||
792 | /* restore all current pin configs */ | ||
793 | static void restore_pincfgs(struct hda_codec *codec) | ||
794 | { | ||
795 | int i; | ||
796 | for (i = 0; i < codec->init_pins.used; i++) { | ||
797 | struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i); | ||
798 | set_pincfg(codec, pin->nid, | ||
799 | snd_hda_codec_get_pincfg(codec, pin->nid)); | ||
800 | } | ||
801 | } | ||
684 | 802 | ||
685 | static void init_hda_cache(struct hda_cache_rec *cache, | 803 | static void init_hda_cache(struct hda_cache_rec *cache, |
686 | unsigned int record_size); | 804 | unsigned int record_size); |
687 | static void free_hda_cache(struct hda_cache_rec *cache); | 805 | static void free_hda_cache(struct hda_cache_rec *cache); |
688 | 806 | ||
807 | /* restore the initial pin cfgs and release all pincfg lists */ | ||
808 | static void restore_init_pincfgs(struct hda_codec *codec) | ||
809 | { | ||
810 | /* first free driver_pins and user_pins, then call restore_pincfg | ||
811 | * so that only the values in init_pins are restored | ||
812 | */ | ||
813 | snd_array_free(&codec->driver_pins); | ||
814 | #ifdef CONFIG_SND_HDA_HWDEP | ||
815 | snd_array_free(&codec->user_pins); | ||
816 | #endif | ||
817 | restore_pincfgs(codec); | ||
818 | snd_array_free(&codec->init_pins); | ||
819 | } | ||
820 | |||
689 | /* | 821 | /* |
690 | * codec destructor | 822 | * codec destructor |
691 | */ | 823 | */ |
@@ -693,6 +825,7 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
693 | { | 825 | { |
694 | if (!codec) | 826 | if (!codec) |
695 | return; | 827 | return; |
828 | restore_init_pincfgs(codec); | ||
696 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 829 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
697 | cancel_delayed_work(&codec->power_work); | 830 | cancel_delayed_work(&codec->power_work); |
698 | flush_workqueue(codec->bus->workq); | 831 | flush_workqueue(codec->bus->workq); |
@@ -711,6 +844,9 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
711 | kfree(codec); | 844 | kfree(codec); |
712 | } | 845 | } |
713 | 846 | ||
847 | static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | ||
848 | unsigned int power_state); | ||
849 | |||
714 | /** | 850 | /** |
715 | * snd_hda_codec_new - create a HDA codec | 851 | * snd_hda_codec_new - create a HDA codec |
716 | * @bus: the bus to assign | 852 | * @bus: the bus to assign |
@@ -750,6 +886,8 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr | |||
750 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); | 886 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); |
751 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); | 887 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); |
752 | snd_array_init(&codec->mixers, sizeof(struct snd_kcontrol *), 32); | 888 | snd_array_init(&codec->mixers, sizeof(struct snd_kcontrol *), 32); |
889 | snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); | ||
890 | snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); | ||
753 | if (codec->bus->modelname) { | 891 | if (codec->bus->modelname) { |
754 | codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); | 892 | codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); |
755 | if (!codec->modelname) { | 893 | if (!codec->modelname) { |
@@ -786,15 +924,18 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr | |||
786 | setup_fg_nodes(codec); | 924 | setup_fg_nodes(codec); |
787 | if (!codec->afg && !codec->mfg) { | 925 | if (!codec->afg && !codec->mfg) { |
788 | snd_printdd("hda_codec: no AFG or MFG node found\n"); | 926 | snd_printdd("hda_codec: no AFG or MFG node found\n"); |
789 | snd_hda_codec_free(codec); | 927 | err = -ENODEV; |
790 | return -ENODEV; | 928 | goto error; |
791 | } | 929 | } |
792 | 930 | ||
793 | if (read_widget_caps(codec, codec->afg ? codec->afg : codec->mfg) < 0) { | 931 | err = read_widget_caps(codec, codec->afg ? codec->afg : codec->mfg); |
932 | if (err < 0) { | ||
794 | snd_printk(KERN_ERR "hda_codec: cannot malloc\n"); | 933 | snd_printk(KERN_ERR "hda_codec: cannot malloc\n"); |
795 | snd_hda_codec_free(codec); | 934 | goto error; |
796 | return -ENOMEM; | ||
797 | } | 935 | } |
936 | err = read_pin_defaults(codec); | ||
937 | if (err < 0) | ||
938 | goto error; | ||
798 | 939 | ||
799 | if (!codec->subsystem_id) { | 940 | if (!codec->subsystem_id) { |
800 | hda_nid_t nid = codec->afg ? codec->afg : codec->mfg; | 941 | hda_nid_t nid = codec->afg ? codec->afg : codec->mfg; |
@@ -805,12 +946,15 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr | |||
805 | if (bus->modelname) | 946 | if (bus->modelname) |
806 | codec->modelname = kstrdup(bus->modelname, GFP_KERNEL); | 947 | codec->modelname = kstrdup(bus->modelname, GFP_KERNEL); |
807 | 948 | ||
949 | /* power-up all before initialization */ | ||
950 | hda_set_power_state(codec, | ||
951 | codec->afg ? codec->afg : codec->mfg, | ||
952 | AC_PWRST_D0); | ||
953 | |||
808 | if (do_init) { | 954 | if (do_init) { |
809 | err = snd_hda_codec_configure(codec); | 955 | err = snd_hda_codec_configure(codec); |
810 | if (err < 0) { | 956 | if (err < 0) |
811 | snd_hda_codec_free(codec); | 957 | goto error; |
812 | return err; | ||
813 | } | ||
814 | } | 958 | } |
815 | snd_hda_codec_proc_new(codec); | 959 | snd_hda_codec_proc_new(codec); |
816 | 960 | ||
@@ -823,6 +967,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr | |||
823 | if (codecp) | 967 | if (codecp) |
824 | *codecp = codec; | 968 | *codecp = codec; |
825 | return 0; | 969 | return 0; |
970 | |||
971 | error: | ||
972 | snd_hda_codec_free(codec); | ||
973 | return err; | ||
826 | } | 974 | } |
827 | EXPORT_SYMBOL_HDA(snd_hda_codec_new); | 975 | EXPORT_SYMBOL_HDA(snd_hda_codec_new); |
828 | 976 | ||
@@ -906,6 +1054,7 @@ EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); | |||
906 | 1054 | ||
907 | /* FIXME: more better hash key? */ | 1055 | /* FIXME: more better hash key? */ |
908 | #define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24)) | 1056 | #define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24)) |
1057 | #define HDA_HASH_PINCAP_KEY(nid) (u32)((nid) + (0x02 << 24)) | ||
909 | #define INFO_AMP_CAPS (1<<0) | 1058 | #define INFO_AMP_CAPS (1<<0) |
910 | #define INFO_AMP_VOL(ch) (1 << (1 + (ch))) | 1059 | #define INFO_AMP_VOL(ch) (1 << (1 + (ch))) |
911 | 1060 | ||
@@ -996,6 +1145,21 @@ int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, | |||
996 | } | 1145 | } |
997 | EXPORT_SYMBOL_HDA(snd_hda_override_amp_caps); | 1146 | EXPORT_SYMBOL_HDA(snd_hda_override_amp_caps); |
998 | 1147 | ||
1148 | u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) | ||
1149 | { | ||
1150 | struct hda_amp_info *info; | ||
1151 | |||
1152 | info = get_alloc_amp_hash(codec, HDA_HASH_PINCAP_KEY(nid)); | ||
1153 | if (!info) | ||
1154 | return 0; | ||
1155 | if (!info->head.val) { | ||
1156 | info->amp_caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | ||
1157 | info->head.val |= INFO_AMP_CAPS; | ||
1158 | } | ||
1159 | return info->amp_caps; | ||
1160 | } | ||
1161 | EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps); | ||
1162 | |||
999 | /* | 1163 | /* |
1000 | * read the current volume to info | 1164 | * read the current volume to info |
1001 | * if the cache exists, read the cache value. | 1165 | * if the cache exists, read the cache value. |
@@ -1119,6 +1283,7 @@ int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, | |||
1119 | u16 nid = get_amp_nid(kcontrol); | 1283 | u16 nid = get_amp_nid(kcontrol); |
1120 | u8 chs = get_amp_channels(kcontrol); | 1284 | u8 chs = get_amp_channels(kcontrol); |
1121 | int dir = get_amp_direction(kcontrol); | 1285 | int dir = get_amp_direction(kcontrol); |
1286 | unsigned int ofs = get_amp_offset(kcontrol); | ||
1122 | u32 caps; | 1287 | u32 caps; |
1123 | 1288 | ||
1124 | caps = query_amp_caps(codec, nid, dir); | 1289 | caps = query_amp_caps(codec, nid, dir); |
@@ -1130,6 +1295,8 @@ int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, | |||
1130 | kcontrol->id.name); | 1295 | kcontrol->id.name); |
1131 | return -EINVAL; | 1296 | return -EINVAL; |
1132 | } | 1297 | } |
1298 | if (ofs < caps) | ||
1299 | caps -= ofs; | ||
1133 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | 1300 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; |
1134 | uinfo->count = chs == 3 ? 2 : 1; | 1301 | uinfo->count = chs == 3 ? 2 : 1; |
1135 | uinfo->value.integer.min = 0; | 1302 | uinfo->value.integer.min = 0; |
@@ -1138,6 +1305,32 @@ int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, | |||
1138 | } | 1305 | } |
1139 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_info); | 1306 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_info); |
1140 | 1307 | ||
1308 | |||
1309 | static inline unsigned int | ||
1310 | read_amp_value(struct hda_codec *codec, hda_nid_t nid, | ||
1311 | int ch, int dir, int idx, unsigned int ofs) | ||
1312 | { | ||
1313 | unsigned int val; | ||
1314 | val = snd_hda_codec_amp_read(codec, nid, ch, dir, idx); | ||
1315 | val &= HDA_AMP_VOLMASK; | ||
1316 | if (val >= ofs) | ||
1317 | val -= ofs; | ||
1318 | else | ||
1319 | val = 0; | ||
1320 | return val; | ||
1321 | } | ||
1322 | |||
1323 | static inline int | ||
1324 | update_amp_value(struct hda_codec *codec, hda_nid_t nid, | ||
1325 | int ch, int dir, int idx, unsigned int ofs, | ||
1326 | unsigned int val) | ||
1327 | { | ||
1328 | if (val > 0) | ||
1329 | val += ofs; | ||
1330 | return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, | ||
1331 | HDA_AMP_VOLMASK, val); | ||
1332 | } | ||
1333 | |||
1141 | int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, | 1334 | int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, |
1142 | struct snd_ctl_elem_value *ucontrol) | 1335 | struct snd_ctl_elem_value *ucontrol) |
1143 | { | 1336 | { |
@@ -1146,14 +1339,13 @@ int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, | |||
1146 | int chs = get_amp_channels(kcontrol); | 1339 | int chs = get_amp_channels(kcontrol); |
1147 | int dir = get_amp_direction(kcontrol); | 1340 | int dir = get_amp_direction(kcontrol); |
1148 | int idx = get_amp_index(kcontrol); | 1341 | int idx = get_amp_index(kcontrol); |
1342 | unsigned int ofs = get_amp_offset(kcontrol); | ||
1149 | long *valp = ucontrol->value.integer.value; | 1343 | long *valp = ucontrol->value.integer.value; |
1150 | 1344 | ||
1151 | if (chs & 1) | 1345 | if (chs & 1) |
1152 | *valp++ = snd_hda_codec_amp_read(codec, nid, 0, dir, idx) | 1346 | *valp++ = read_amp_value(codec, nid, 0, dir, idx, ofs); |
1153 | & HDA_AMP_VOLMASK; | ||
1154 | if (chs & 2) | 1347 | if (chs & 2) |
1155 | *valp = snd_hda_codec_amp_read(codec, nid, 1, dir, idx) | 1348 | *valp = read_amp_value(codec, nid, 1, dir, idx, ofs); |
1156 | & HDA_AMP_VOLMASK; | ||
1157 | return 0; | 1349 | return 0; |
1158 | } | 1350 | } |
1159 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_get); | 1351 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_get); |
@@ -1166,18 +1358,17 @@ int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, | |||
1166 | int chs = get_amp_channels(kcontrol); | 1358 | int chs = get_amp_channels(kcontrol); |
1167 | int dir = get_amp_direction(kcontrol); | 1359 | int dir = get_amp_direction(kcontrol); |
1168 | int idx = get_amp_index(kcontrol); | 1360 | int idx = get_amp_index(kcontrol); |
1361 | unsigned int ofs = get_amp_offset(kcontrol); | ||
1169 | long *valp = ucontrol->value.integer.value; | 1362 | long *valp = ucontrol->value.integer.value; |
1170 | int change = 0; | 1363 | int change = 0; |
1171 | 1364 | ||
1172 | snd_hda_power_up(codec); | 1365 | snd_hda_power_up(codec); |
1173 | if (chs & 1) { | 1366 | if (chs & 1) { |
1174 | change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, | 1367 | change = update_amp_value(codec, nid, 0, dir, idx, ofs, *valp); |
1175 | 0x7f, *valp); | ||
1176 | valp++; | 1368 | valp++; |
1177 | } | 1369 | } |
1178 | if (chs & 2) | 1370 | if (chs & 2) |
1179 | change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, | 1371 | change |= update_amp_value(codec, nid, 1, dir, idx, ofs, *valp); |
1180 | 0x7f, *valp); | ||
1181 | snd_hda_power_down(codec); | 1372 | snd_hda_power_down(codec); |
1182 | return change; | 1373 | return change; |
1183 | } | 1374 | } |
@@ -1189,6 +1380,7 @@ int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, | |||
1189 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 1380 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
1190 | hda_nid_t nid = get_amp_nid(kcontrol); | 1381 | hda_nid_t nid = get_amp_nid(kcontrol); |
1191 | int dir = get_amp_direction(kcontrol); | 1382 | int dir = get_amp_direction(kcontrol); |
1383 | unsigned int ofs = get_amp_offset(kcontrol); | ||
1192 | u32 caps, val1, val2; | 1384 | u32 caps, val1, val2; |
1193 | 1385 | ||
1194 | if (size < 4 * sizeof(unsigned int)) | 1386 | if (size < 4 * sizeof(unsigned int)) |
@@ -1197,6 +1389,7 @@ int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, | |||
1197 | val2 = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT; | 1389 | val2 = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT; |
1198 | val2 = (val2 + 1) * 25; | 1390 | val2 = (val2 + 1) * 25; |
1199 | val1 = -((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT); | 1391 | val1 = -((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT); |
1392 | val1 += ofs; | ||
1200 | val1 = ((int)val1) * ((int)val2); | 1393 | val1 = ((int)val1) * ((int)val2); |
1201 | if (put_user(SNDRV_CTL_TLVT_DB_SCALE, _tlv)) | 1394 | if (put_user(SNDRV_CTL_TLVT_DB_SCALE, _tlv)) |
1202 | return -EFAULT; | 1395 | return -EFAULT; |
@@ -1267,7 +1460,6 @@ int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl) | |||
1267 | } | 1460 | } |
1268 | EXPORT_SYMBOL_HDA(snd_hda_ctl_add); | 1461 | EXPORT_SYMBOL_HDA(snd_hda_ctl_add); |
1269 | 1462 | ||
1270 | #ifdef CONFIG_SND_HDA_RECONFIG | ||
1271 | /* Clear all controls assigned to the given codec */ | 1463 | /* Clear all controls assigned to the given codec */ |
1272 | void snd_hda_ctls_clear(struct hda_codec *codec) | 1464 | void snd_hda_ctls_clear(struct hda_codec *codec) |
1273 | { | 1465 | { |
@@ -1278,9 +1470,52 @@ void snd_hda_ctls_clear(struct hda_codec *codec) | |||
1278 | snd_array_free(&codec->mixers); | 1470 | snd_array_free(&codec->mixers); |
1279 | } | 1471 | } |
1280 | 1472 | ||
1281 | void snd_hda_codec_reset(struct hda_codec *codec) | 1473 | /* pseudo device locking |
1474 | * toggle card->shutdown to allow/disallow the device access (as a hack) | ||
1475 | */ | ||
1476 | static int hda_lock_devices(struct snd_card *card) | ||
1282 | { | 1477 | { |
1283 | int i; | 1478 | spin_lock(&card->files_lock); |
1479 | if (card->shutdown) { | ||
1480 | spin_unlock(&card->files_lock); | ||
1481 | return -EINVAL; | ||
1482 | } | ||
1483 | card->shutdown = 1; | ||
1484 | spin_unlock(&card->files_lock); | ||
1485 | return 0; | ||
1486 | } | ||
1487 | |||
1488 | static void hda_unlock_devices(struct snd_card *card) | ||
1489 | { | ||
1490 | spin_lock(&card->files_lock); | ||
1491 | card->shutdown = 0; | ||
1492 | spin_unlock(&card->files_lock); | ||
1493 | } | ||
1494 | |||
1495 | int snd_hda_codec_reset(struct hda_codec *codec) | ||
1496 | { | ||
1497 | struct snd_card *card = codec->bus->card; | ||
1498 | int i, pcm; | ||
1499 | |||
1500 | if (hda_lock_devices(card) < 0) | ||
1501 | return -EBUSY; | ||
1502 | /* check whether the codec isn't used by any mixer or PCM streams */ | ||
1503 | if (!list_empty(&card->ctl_files)) { | ||
1504 | hda_unlock_devices(card); | ||
1505 | return -EBUSY; | ||
1506 | } | ||
1507 | for (pcm = 0; pcm < codec->num_pcms; pcm++) { | ||
1508 | struct hda_pcm *cpcm = &codec->pcm_info[pcm]; | ||
1509 | if (!cpcm->pcm) | ||
1510 | continue; | ||
1511 | if (cpcm->pcm->streams[0].substream_opened || | ||
1512 | cpcm->pcm->streams[1].substream_opened) { | ||
1513 | hda_unlock_devices(card); | ||
1514 | return -EBUSY; | ||
1515 | } | ||
1516 | } | ||
1517 | |||
1518 | /* OK, let it free */ | ||
1284 | 1519 | ||
1285 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 1520 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
1286 | cancel_delayed_work(&codec->power_work); | 1521 | cancel_delayed_work(&codec->power_work); |
@@ -1290,8 +1525,7 @@ void snd_hda_codec_reset(struct hda_codec *codec) | |||
1290 | /* relase PCMs */ | 1525 | /* relase PCMs */ |
1291 | for (i = 0; i < codec->num_pcms; i++) { | 1526 | for (i = 0; i < codec->num_pcms; i++) { |
1292 | if (codec->pcm_info[i].pcm) { | 1527 | if (codec->pcm_info[i].pcm) { |
1293 | snd_device_free(codec->bus->card, | 1528 | snd_device_free(card, codec->pcm_info[i].pcm); |
1294 | codec->pcm_info[i].pcm); | ||
1295 | clear_bit(codec->pcm_info[i].device, | 1529 | clear_bit(codec->pcm_info[i].device, |
1296 | codec->bus->pcm_dev_bits); | 1530 | codec->bus->pcm_dev_bits); |
1297 | } | 1531 | } |
@@ -1304,13 +1538,22 @@ void snd_hda_codec_reset(struct hda_codec *codec) | |||
1304 | free_hda_cache(&codec->cmd_cache); | 1538 | free_hda_cache(&codec->cmd_cache); |
1305 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); | 1539 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); |
1306 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); | 1540 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); |
1541 | /* free only driver_pins so that init_pins + user_pins are restored */ | ||
1542 | snd_array_free(&codec->driver_pins); | ||
1543 | restore_pincfgs(codec); | ||
1307 | codec->num_pcms = 0; | 1544 | codec->num_pcms = 0; |
1308 | codec->pcm_info = NULL; | 1545 | codec->pcm_info = NULL; |
1309 | codec->preset = NULL; | 1546 | codec->preset = NULL; |
1547 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | ||
1548 | codec->slave_dig_outs = NULL; | ||
1549 | codec->spdif_status_reset = 0; | ||
1310 | module_put(codec->owner); | 1550 | module_put(codec->owner); |
1311 | codec->owner = NULL; | 1551 | codec->owner = NULL; |
1552 | |||
1553 | /* allow device access again */ | ||
1554 | hda_unlock_devices(card); | ||
1555 | return 0; | ||
1312 | } | 1556 | } |
1313 | #endif /* CONFIG_SND_HDA_RECONFIG */ | ||
1314 | 1557 | ||
1315 | /* create a virtual master control and add slaves */ | 1558 | /* create a virtual master control and add slaves */ |
1316 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | 1559 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
@@ -1335,15 +1578,20 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | |||
1335 | 1578 | ||
1336 | for (s = slaves; *s; s++) { | 1579 | for (s = slaves; *s; s++) { |
1337 | struct snd_kcontrol *sctl; | 1580 | struct snd_kcontrol *sctl; |
1338 | 1581 | int i = 0; | |
1339 | sctl = snd_hda_find_mixer_ctl(codec, *s); | 1582 | for (;;) { |
1340 | if (!sctl) { | 1583 | sctl = _snd_hda_find_mixer_ctl(codec, *s, i); |
1341 | snd_printdd("Cannot find slave %s, skipped\n", *s); | 1584 | if (!sctl) { |
1342 | continue; | 1585 | if (!i) |
1586 | snd_printdd("Cannot find slave %s, " | ||
1587 | "skipped\n", *s); | ||
1588 | break; | ||
1589 | } | ||
1590 | err = snd_ctl_add_slave(kctl, sctl); | ||
1591 | if (err < 0) | ||
1592 | return err; | ||
1593 | i++; | ||
1343 | } | 1594 | } |
1344 | err = snd_ctl_add_slave(kctl, sctl); | ||
1345 | if (err < 0) | ||
1346 | return err; | ||
1347 | } | 1595 | } |
1348 | return 0; | 1596 | return 0; |
1349 | } | 1597 | } |
@@ -1954,6 +2202,8 @@ int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid) | |||
1954 | } | 2202 | } |
1955 | for (dig_mix = dig_in_ctls; dig_mix->name; dig_mix++) { | 2203 | for (dig_mix = dig_in_ctls; dig_mix->name; dig_mix++) { |
1956 | kctl = snd_ctl_new1(dig_mix, codec); | 2204 | kctl = snd_ctl_new1(dig_mix, codec); |
2205 | if (!kctl) | ||
2206 | return -ENOMEM; | ||
1957 | kctl->private_value = nid; | 2207 | kctl->private_value = nid; |
1958 | err = snd_hda_ctl_add(codec, kctl); | 2208 | err = snd_hda_ctl_add(codec, kctl); |
1959 | if (err < 0) | 2209 | if (err < 0) |
@@ -2002,7 +2252,11 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid, | |||
2002 | err = bus->ops.command(bus, res); | 2252 | err = bus->ops.command(bus, res); |
2003 | if (!err) { | 2253 | if (!err) { |
2004 | struct hda_cache_head *c; | 2254 | struct hda_cache_head *c; |
2005 | u32 key = build_cmd_cache_key(nid, verb); | 2255 | u32 key; |
2256 | /* parm may contain the verb stuff for get/set amp */ | ||
2257 | verb = verb | (parm >> 8); | ||
2258 | parm &= 0xff; | ||
2259 | key = build_cmd_cache_key(nid, verb); | ||
2006 | c = get_alloc_hash(&codec->cmd_cache, key); | 2260 | c = get_alloc_hash(&codec->cmd_cache, key); |
2007 | if (c) | 2261 | if (c) |
2008 | c->val = parm; | 2262 | c->val = parm; |
@@ -2073,8 +2327,7 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | |||
2073 | * don't power down the widget if it controls | 2327 | * don't power down the widget if it controls |
2074 | * eapd and EAPD_BTLENABLE is set. | 2328 | * eapd and EAPD_BTLENABLE is set. |
2075 | */ | 2329 | */ |
2076 | pincap = snd_hda_param_read(codec, nid, | 2330 | pincap = snd_hda_query_pin_caps(codec, nid); |
2077 | AC_PAR_PIN_CAP); | ||
2078 | if (pincap & AC_PINCAP_EAPD) { | 2331 | if (pincap & AC_PINCAP_EAPD) { |
2079 | int eapd = snd_hda_codec_read(codec, | 2332 | int eapd = snd_hda_codec_read(codec, |
2080 | nid, 0, | 2333 | nid, 0, |
@@ -2143,6 +2396,7 @@ static void hda_call_codec_resume(struct hda_codec *codec) | |||
2143 | hda_set_power_state(codec, | 2396 | hda_set_power_state(codec, |
2144 | codec->afg ? codec->afg : codec->mfg, | 2397 | codec->afg ? codec->afg : codec->mfg, |
2145 | AC_PWRST_D0); | 2398 | AC_PWRST_D0); |
2399 | restore_pincfgs(codec); /* restore all current pin configs */ | ||
2146 | hda_exec_init_verbs(codec); | 2400 | hda_exec_init_verbs(codec); |
2147 | if (codec->patch_ops.resume) | 2401 | if (codec->patch_ops.resume) |
2148 | codec->patch_ops.resume(codec); | 2402 | codec->patch_ops.resume(codec); |
@@ -2170,8 +2424,16 @@ int /*__devinit*/ snd_hda_build_controls(struct hda_bus *bus) | |||
2170 | 2424 | ||
2171 | list_for_each_entry(codec, &bus->codec_list, list) { | 2425 | list_for_each_entry(codec, &bus->codec_list, list) { |
2172 | int err = snd_hda_codec_build_controls(codec); | 2426 | int err = snd_hda_codec_build_controls(codec); |
2173 | if (err < 0) | 2427 | if (err < 0) { |
2174 | return err; | 2428 | printk(KERN_ERR "hda_codec: cannot build controls" |
2429 | "for #%d (error %d)\n", codec->addr, err); | ||
2430 | err = snd_hda_codec_reset(codec); | ||
2431 | if (err < 0) { | ||
2432 | printk(KERN_ERR | ||
2433 | "hda_codec: cannot revert codec\n"); | ||
2434 | return err; | ||
2435 | } | ||
2436 | } | ||
2175 | } | 2437 | } |
2176 | return 0; | 2438 | return 0; |
2177 | } | 2439 | } |
@@ -2180,19 +2442,12 @@ EXPORT_SYMBOL_HDA(snd_hda_build_controls); | |||
2180 | int snd_hda_codec_build_controls(struct hda_codec *codec) | 2442 | int snd_hda_codec_build_controls(struct hda_codec *codec) |
2181 | { | 2443 | { |
2182 | int err = 0; | 2444 | int err = 0; |
2183 | /* fake as if already powered-on */ | ||
2184 | hda_keep_power_on(codec); | ||
2185 | /* then fire up */ | ||
2186 | hda_set_power_state(codec, | ||
2187 | codec->afg ? codec->afg : codec->mfg, | ||
2188 | AC_PWRST_D0); | ||
2189 | hda_exec_init_verbs(codec); | 2445 | hda_exec_init_verbs(codec); |
2190 | /* continue to initialize... */ | 2446 | /* continue to initialize... */ |
2191 | if (codec->patch_ops.init) | 2447 | if (codec->patch_ops.init) |
2192 | err = codec->patch_ops.init(codec); | 2448 | err = codec->patch_ops.init(codec); |
2193 | if (!err && codec->patch_ops.build_controls) | 2449 | if (!err && codec->patch_ops.build_controls) |
2194 | err = codec->patch_ops.build_controls(codec); | 2450 | err = codec->patch_ops.build_controls(codec); |
2195 | snd_hda_power_down(codec); | ||
2196 | if (err < 0) | 2451 | if (err < 0) |
2197 | return err; | 2452 | return err; |
2198 | return 0; | 2453 | return 0; |
@@ -2305,12 +2560,11 @@ EXPORT_SYMBOL_HDA(snd_hda_calc_stream_format); | |||
2305 | static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, | 2560 | static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, |
2306 | u32 *ratesp, u64 *formatsp, unsigned int *bpsp) | 2561 | u32 *ratesp, u64 *formatsp, unsigned int *bpsp) |
2307 | { | 2562 | { |
2308 | int i; | 2563 | unsigned int i, val, wcaps; |
2309 | unsigned int val, streams; | ||
2310 | 2564 | ||
2311 | val = 0; | 2565 | val = 0; |
2312 | if (nid != codec->afg && | 2566 | wcaps = get_wcaps(codec, nid); |
2313 | (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) { | 2567 | if (nid != codec->afg && (wcaps & AC_WCAP_FORMAT_OVRD)) { |
2314 | val = snd_hda_param_read(codec, nid, AC_PAR_PCM); | 2568 | val = snd_hda_param_read(codec, nid, AC_PAR_PCM); |
2315 | if (val == -1) | 2569 | if (val == -1) |
2316 | return -EIO; | 2570 | return -EIO; |
@@ -2324,15 +2578,20 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, | |||
2324 | if (val & (1 << i)) | 2578 | if (val & (1 << i)) |
2325 | rates |= rate_bits[i].alsa_bits; | 2579 | rates |= rate_bits[i].alsa_bits; |
2326 | } | 2580 | } |
2581 | if (rates == 0) { | ||
2582 | snd_printk(KERN_ERR "hda_codec: rates == 0 " | ||
2583 | "(nid=0x%x, val=0x%x, ovrd=%i)\n", | ||
2584 | nid, val, | ||
2585 | (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0); | ||
2586 | return -EIO; | ||
2587 | } | ||
2327 | *ratesp = rates; | 2588 | *ratesp = rates; |
2328 | } | 2589 | } |
2329 | 2590 | ||
2330 | if (formatsp || bpsp) { | 2591 | if (formatsp || bpsp) { |
2331 | u64 formats = 0; | 2592 | u64 formats = 0; |
2332 | unsigned int bps; | 2593 | unsigned int streams, bps; |
2333 | unsigned int wcaps; | ||
2334 | 2594 | ||
2335 | wcaps = get_wcaps(codec, nid); | ||
2336 | streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); | 2595 | streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); |
2337 | if (streams == -1) | 2596 | if (streams == -1) |
2338 | return -EIO; | 2597 | return -EIO; |
@@ -2385,6 +2644,15 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, | |||
2385 | formats |= SNDRV_PCM_FMTBIT_U8; | 2644 | formats |= SNDRV_PCM_FMTBIT_U8; |
2386 | bps = 8; | 2645 | bps = 8; |
2387 | } | 2646 | } |
2647 | if (formats == 0) { | ||
2648 | snd_printk(KERN_ERR "hda_codec: formats == 0 " | ||
2649 | "(nid=0x%x, val=0x%x, ovrd=%i, " | ||
2650 | "streams=0x%x)\n", | ||
2651 | nid, val, | ||
2652 | (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0, | ||
2653 | streams); | ||
2654 | return -EIO; | ||
2655 | } | ||
2388 | if (formatsp) | 2656 | if (formatsp) |
2389 | *formatsp = formats; | 2657 | *formatsp = formats; |
2390 | if (bpsp) | 2658 | if (bpsp) |
@@ -2500,12 +2768,16 @@ static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo, | |||
2500 | static int set_pcm_default_values(struct hda_codec *codec, | 2768 | static int set_pcm_default_values(struct hda_codec *codec, |
2501 | struct hda_pcm_stream *info) | 2769 | struct hda_pcm_stream *info) |
2502 | { | 2770 | { |
2771 | int err; | ||
2772 | |||
2503 | /* query support PCM information from the given NID */ | 2773 | /* query support PCM information from the given NID */ |
2504 | if (info->nid && (!info->rates || !info->formats)) { | 2774 | if (info->nid && (!info->rates || !info->formats)) { |
2505 | snd_hda_query_supported_pcm(codec, info->nid, | 2775 | err = snd_hda_query_supported_pcm(codec, info->nid, |
2506 | info->rates ? NULL : &info->rates, | 2776 | info->rates ? NULL : &info->rates, |
2507 | info->formats ? NULL : &info->formats, | 2777 | info->formats ? NULL : &info->formats, |
2508 | info->maxbps ? NULL : &info->maxbps); | 2778 | info->maxbps ? NULL : &info->maxbps); |
2779 | if (err < 0) | ||
2780 | return err; | ||
2509 | } | 2781 | } |
2510 | if (info->ops.open == NULL) | 2782 | if (info->ops.open == NULL) |
2511 | info->ops.open = hda_pcm_default_open_close; | 2783 | info->ops.open = hda_pcm_default_open_close; |
@@ -2548,13 +2820,10 @@ static int get_empty_pcm_device(struct hda_bus *bus, int type) | |||
2548 | for (i = 0; i < ARRAY_SIZE(audio_idx); i++) { | 2820 | for (i = 0; i < ARRAY_SIZE(audio_idx); i++) { |
2549 | dev = audio_idx[i]; | 2821 | dev = audio_idx[i]; |
2550 | if (!test_bit(dev, bus->pcm_dev_bits)) | 2822 | if (!test_bit(dev, bus->pcm_dev_bits)) |
2551 | break; | 2823 | goto ok; |
2552 | } | 2824 | } |
2553 | if (i >= ARRAY_SIZE(audio_idx)) { | 2825 | snd_printk(KERN_WARNING "Too many audio devices\n"); |
2554 | snd_printk(KERN_WARNING "Too many audio devices\n"); | 2826 | return -EAGAIN; |
2555 | return -EAGAIN; | ||
2556 | } | ||
2557 | break; | ||
2558 | case HDA_PCM_TYPE_SPDIF: | 2827 | case HDA_PCM_TYPE_SPDIF: |
2559 | case HDA_PCM_TYPE_HDMI: | 2828 | case HDA_PCM_TYPE_HDMI: |
2560 | case HDA_PCM_TYPE_MODEM: | 2829 | case HDA_PCM_TYPE_MODEM: |
@@ -2569,6 +2838,7 @@ static int get_empty_pcm_device(struct hda_bus *bus, int type) | |||
2569 | snd_printk(KERN_WARNING "Invalid PCM type %d\n", type); | 2838 | snd_printk(KERN_WARNING "Invalid PCM type %d\n", type); |
2570 | return -EINVAL; | 2839 | return -EINVAL; |
2571 | } | 2840 | } |
2841 | ok: | ||
2572 | set_bit(dev, bus->pcm_dev_bits); | 2842 | set_bit(dev, bus->pcm_dev_bits); |
2573 | return dev; | 2843 | return dev; |
2574 | } | 2844 | } |
@@ -2605,24 +2875,36 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec) | |||
2605 | if (!codec->patch_ops.build_pcms) | 2875 | if (!codec->patch_ops.build_pcms) |
2606 | return 0; | 2876 | return 0; |
2607 | err = codec->patch_ops.build_pcms(codec); | 2877 | err = codec->patch_ops.build_pcms(codec); |
2608 | if (err < 0) | 2878 | if (err < 0) { |
2609 | return err; | 2879 | printk(KERN_ERR "hda_codec: cannot build PCMs" |
2880 | "for #%d (error %d)\n", codec->addr, err); | ||
2881 | err = snd_hda_codec_reset(codec); | ||
2882 | if (err < 0) { | ||
2883 | printk(KERN_ERR | ||
2884 | "hda_codec: cannot revert codec\n"); | ||
2885 | return err; | ||
2886 | } | ||
2887 | } | ||
2610 | } | 2888 | } |
2611 | for (pcm = 0; pcm < codec->num_pcms; pcm++) { | 2889 | for (pcm = 0; pcm < codec->num_pcms; pcm++) { |
2612 | struct hda_pcm *cpcm = &codec->pcm_info[pcm]; | 2890 | struct hda_pcm *cpcm = &codec->pcm_info[pcm]; |
2613 | int dev; | 2891 | int dev; |
2614 | 2892 | ||
2615 | if (!cpcm->stream[0].substreams && !cpcm->stream[1].substreams) | 2893 | if (!cpcm->stream[0].substreams && !cpcm->stream[1].substreams) |
2616 | return 0; /* no substreams assigned */ | 2894 | continue; /* no substreams assigned */ |
2617 | 2895 | ||
2618 | if (!cpcm->pcm) { | 2896 | if (!cpcm->pcm) { |
2619 | dev = get_empty_pcm_device(codec->bus, cpcm->pcm_type); | 2897 | dev = get_empty_pcm_device(codec->bus, cpcm->pcm_type); |
2620 | if (dev < 0) | 2898 | if (dev < 0) |
2621 | return 0; | 2899 | continue; /* no fatal error */ |
2622 | cpcm->device = dev; | 2900 | cpcm->device = dev; |
2623 | err = snd_hda_attach_pcm(codec, cpcm); | 2901 | err = snd_hda_attach_pcm(codec, cpcm); |
2624 | if (err < 0) | 2902 | if (err < 0) { |
2625 | return err; | 2903 | printk(KERN_ERR "hda_codec: cannot attach " |
2904 | "PCM stream %d for codec #%d\n", | ||
2905 | dev, codec->addr); | ||
2906 | continue; /* no fatal error */ | ||
2907 | } | ||
2626 | } | 2908 | } |
2627 | } | 2909 | } |
2628 | return 0; | 2910 | return 0; |
@@ -2724,6 +3006,67 @@ int snd_hda_check_board_config(struct hda_codec *codec, | |||
2724 | EXPORT_SYMBOL_HDA(snd_hda_check_board_config); | 3006 | EXPORT_SYMBOL_HDA(snd_hda_check_board_config); |
2725 | 3007 | ||
2726 | /** | 3008 | /** |
3009 | * snd_hda_check_board_codec_sid_config - compare the current codec | ||
3010 | subsystem ID with the | ||
3011 | config table | ||
3012 | |||
3013 | This is important for Gateway notebooks with SB450 HDA Audio | ||
3014 | where the vendor ID of the PCI device is: | ||
3015 | ATI Technologies Inc SB450 HDA Audio [1002:437b] | ||
3016 | and the vendor/subvendor are found only at the codec. | ||
3017 | |||
3018 | * @codec: the HDA codec | ||
3019 | * @num_configs: number of config enums | ||
3020 | * @models: array of model name strings | ||
3021 | * @tbl: configuration table, terminated by null entries | ||
3022 | * | ||
3023 | * Compares the modelname or PCI subsystem id of the current codec with the | ||
3024 | * given configuration table. If a matching entry is found, returns its | ||
3025 | * config value (supposed to be 0 or positive). | ||
3026 | * | ||
3027 | * If no entries are matching, the function returns a negative value. | ||
3028 | */ | ||
3029 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, | ||
3030 | int num_configs, const char **models, | ||
3031 | const struct snd_pci_quirk *tbl) | ||
3032 | { | ||
3033 | const struct snd_pci_quirk *q; | ||
3034 | |||
3035 | /* Search for codec ID */ | ||
3036 | for (q = tbl; q->subvendor; q++) { | ||
3037 | unsigned long vendorid = (q->subdevice) | (q->subvendor << 16); | ||
3038 | |||
3039 | if (vendorid == codec->subsystem_id) | ||
3040 | break; | ||
3041 | } | ||
3042 | |||
3043 | if (!q->subvendor) | ||
3044 | return -1; | ||
3045 | |||
3046 | tbl = q; | ||
3047 | |||
3048 | if (tbl->value >= 0 && tbl->value < num_configs) { | ||
3049 | #ifdef CONFIG_SND_DEBUG_DETECT | ||
3050 | char tmp[10]; | ||
3051 | const char *model = NULL; | ||
3052 | if (models) | ||
3053 | model = models[tbl->value]; | ||
3054 | if (!model) { | ||
3055 | sprintf(tmp, "#%d", tbl->value); | ||
3056 | model = tmp; | ||
3057 | } | ||
3058 | snd_printdd(KERN_INFO "hda_codec: model '%s' is selected " | ||
3059 | "for config %x:%x (%s)\n", | ||
3060 | model, tbl->subvendor, tbl->subdevice, | ||
3061 | (tbl->name ? tbl->name : "Unknown device")); | ||
3062 | #endif | ||
3063 | return tbl->value; | ||
3064 | } | ||
3065 | return -1; | ||
3066 | } | ||
3067 | EXPORT_SYMBOL_HDA(snd_hda_check_board_codec_sid_config); | ||
3068 | |||
3069 | /** | ||
2727 | * snd_hda_add_new_ctls - create controls from the array | 3070 | * snd_hda_add_new_ctls - create controls from the array |
2728 | * @codec: the HDA codec | 3071 | * @codec: the HDA codec |
2729 | * @knew: the array of struct snd_kcontrol_new | 3072 | * @knew: the array of struct snd_kcontrol_new |
@@ -2815,7 +3158,7 @@ void snd_hda_power_down(struct hda_codec *codec) | |||
2815 | return; | 3158 | return; |
2816 | if (power_save(codec)) { | 3159 | if (power_save(codec)) { |
2817 | codec->power_transition = 1; /* avoid reentrance */ | 3160 | codec->power_transition = 1; /* avoid reentrance */ |
2818 | schedule_delayed_work(&codec->power_work, | 3161 | queue_delayed_work(codec->bus->workq, &codec->power_work, |
2819 | msecs_to_jiffies(power_save(codec) * 1000)); | 3162 | msecs_to_jiffies(power_save(codec) * 1000)); |
2820 | } | 3163 | } |
2821 | } | 3164 | } |
@@ -3026,6 +3369,16 @@ int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, | |||
3026 | } | 3369 | } |
3027 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare); | 3370 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare); |
3028 | 3371 | ||
3372 | int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, | ||
3373 | struct hda_multi_out *mout) | ||
3374 | { | ||
3375 | mutex_lock(&codec->spdif_mutex); | ||
3376 | cleanup_dig_out_stream(codec, mout->dig_out_nid); | ||
3377 | mutex_unlock(&codec->spdif_mutex); | ||
3378 | return 0; | ||
3379 | } | ||
3380 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup); | ||
3381 | |||
3029 | /* | 3382 | /* |
3030 | * release the digital out | 3383 | * release the digital out |
3031 | */ | 3384 | */ |
@@ -3252,8 +3605,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
3252 | if (ignore_nids && is_in_nid_list(nid, ignore_nids)) | 3605 | if (ignore_nids && is_in_nid_list(nid, ignore_nids)) |
3253 | continue; | 3606 | continue; |
3254 | 3607 | ||
3255 | def_conf = snd_hda_codec_read(codec, nid, 0, | 3608 | def_conf = snd_hda_codec_get_pincfg(codec, nid); |
3256 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3257 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) | 3609 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) |
3258 | continue; | 3610 | continue; |
3259 | loc = get_defcfg_location(def_conf); | 3611 | loc = get_defcfg_location(def_conf); |
@@ -3329,10 +3681,22 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
3329 | cfg->input_pins[AUTO_PIN_AUX] = nid; | 3681 | cfg->input_pins[AUTO_PIN_AUX] = nid; |
3330 | break; | 3682 | break; |
3331 | case AC_JACK_SPDIF_OUT: | 3683 | case AC_JACK_SPDIF_OUT: |
3332 | cfg->dig_out_pin = nid; | 3684 | case AC_JACK_DIG_OTHER_OUT: |
3685 | if (cfg->dig_outs >= ARRAY_SIZE(cfg->dig_out_pins)) | ||
3686 | continue; | ||
3687 | cfg->dig_out_pins[cfg->dig_outs] = nid; | ||
3688 | cfg->dig_out_type[cfg->dig_outs] = | ||
3689 | (loc == AC_JACK_LOC_HDMI) ? | ||
3690 | HDA_PCM_TYPE_HDMI : HDA_PCM_TYPE_SPDIF; | ||
3691 | cfg->dig_outs++; | ||
3333 | break; | 3692 | break; |
3334 | case AC_JACK_SPDIF_IN: | 3693 | case AC_JACK_SPDIF_IN: |
3694 | case AC_JACK_DIG_OTHER_IN: | ||
3335 | cfg->dig_in_pin = nid; | 3695 | cfg->dig_in_pin = nid; |
3696 | if (loc == AC_JACK_LOC_HDMI) | ||
3697 | cfg->dig_in_type = HDA_PCM_TYPE_HDMI; | ||
3698 | else | ||
3699 | cfg->dig_in_type = HDA_PCM_TYPE_SPDIF; | ||
3336 | break; | 3700 | break; |
3337 | } | 3701 | } |
3338 | } | 3702 | } |
@@ -3438,6 +3802,9 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
3438 | cfg->hp_pins[1], cfg->hp_pins[2], | 3802 | cfg->hp_pins[1], cfg->hp_pins[2], |
3439 | cfg->hp_pins[3], cfg->hp_pins[4]); | 3803 | cfg->hp_pins[3], cfg->hp_pins[4]); |
3440 | snd_printd(" mono: mono_out=0x%x\n", cfg->mono_out_pin); | 3804 | snd_printd(" mono: mono_out=0x%x\n", cfg->mono_out_pin); |
3805 | if (cfg->dig_outs) | ||
3806 | snd_printd(" dig-out=0x%x/0x%x\n", | ||
3807 | cfg->dig_out_pins[0], cfg->dig_out_pins[1]); | ||
3441 | snd_printd(" inputs: mic=0x%x, fmic=0x%x, line=0x%x, fline=0x%x," | 3808 | snd_printd(" inputs: mic=0x%x, fmic=0x%x, line=0x%x, fline=0x%x," |
3442 | " cd=0x%x, aux=0x%x\n", | 3809 | " cd=0x%x, aux=0x%x\n", |
3443 | cfg->input_pins[AUTO_PIN_MIC], | 3810 | cfg->input_pins[AUTO_PIN_MIC], |
@@ -3446,6 +3813,8 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
3446 | cfg->input_pins[AUTO_PIN_FRONT_LINE], | 3813 | cfg->input_pins[AUTO_PIN_FRONT_LINE], |
3447 | cfg->input_pins[AUTO_PIN_CD], | 3814 | cfg->input_pins[AUTO_PIN_CD], |
3448 | cfg->input_pins[AUTO_PIN_AUX]); | 3815 | cfg->input_pins[AUTO_PIN_AUX]); |
3816 | if (cfg->dig_in_pin) | ||
3817 | snd_printd(" dig-in=0x%x\n", cfg->dig_in_pin); | ||
3449 | 3818 | ||
3450 | return 0; | 3819 | return 0; |
3451 | } | 3820 | } |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 5810ef588402..2fdecf4b0eb6 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -614,6 +614,7 @@ struct hda_bus { | |||
614 | 614 | ||
615 | /* unsolicited event queue */ | 615 | /* unsolicited event queue */ |
616 | struct hda_bus_unsolicited *unsol; | 616 | struct hda_bus_unsolicited *unsol; |
617 | char workq_name[16]; | ||
617 | struct workqueue_struct *workq; /* common workqueue for codecs */ | 618 | struct workqueue_struct *workq; /* common workqueue for codecs */ |
618 | 619 | ||
619 | /* assigned PCMs */ | 620 | /* assigned PCMs */ |
@@ -738,6 +739,7 @@ struct hda_codec { | |||
738 | hda_nid_t mfg; /* MFG node id */ | 739 | hda_nid_t mfg; /* MFG node id */ |
739 | 740 | ||
740 | /* ids */ | 741 | /* ids */ |
742 | u32 function_id; | ||
741 | u32 vendor_id; | 743 | u32 vendor_id; |
742 | u32 subsystem_id; | 744 | u32 subsystem_id; |
743 | u32 revision_id; | 745 | u32 revision_id; |
@@ -777,11 +779,14 @@ struct hda_codec { | |||
777 | unsigned short spdif_ctls; /* SPDIF control bits */ | 779 | unsigned short spdif_ctls; /* SPDIF control bits */ |
778 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 780 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
779 | hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ | 781 | hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ |
782 | struct snd_array init_pins; /* initial (BIOS) pin configurations */ | ||
783 | struct snd_array driver_pins; /* pin configs set by codec parser */ | ||
780 | 784 | ||
781 | #ifdef CONFIG_SND_HDA_HWDEP | 785 | #ifdef CONFIG_SND_HDA_HWDEP |
782 | struct snd_hwdep *hwdep; /* assigned hwdep device */ | 786 | struct snd_hwdep *hwdep; /* assigned hwdep device */ |
783 | struct snd_array init_verbs; /* additional init verbs */ | 787 | struct snd_array init_verbs; /* additional init verbs */ |
784 | struct snd_array hints; /* additional hints */ | 788 | struct snd_array hints; /* additional hints */ |
789 | struct snd_array user_pins; /* default pin configs to override */ | ||
785 | #endif | 790 | #endif |
786 | 791 | ||
787 | /* misc flags */ | 792 | /* misc flags */ |
@@ -789,6 +794,9 @@ struct hda_codec { | |||
789 | * status change | 794 | * status change |
790 | * (e.g. Realtek codecs) | 795 | * (e.g. Realtek codecs) |
791 | */ | 796 | */ |
797 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index | ||
798 | * (e.g. Conexant codecs) | ||
799 | */ | ||
792 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 800 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
793 | unsigned int power_on :1; /* current (global) power-state */ | 801 | unsigned int power_on :1; /* current (global) power-state */ |
794 | unsigned int power_transition :1; /* power-state in transition */ | 802 | unsigned int power_transition :1; /* power-state in transition */ |
@@ -854,6 +862,18 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec); | |||
854 | #define snd_hda_sequence_write_cache snd_hda_sequence_write | 862 | #define snd_hda_sequence_write_cache snd_hda_sequence_write |
855 | #endif | 863 | #endif |
856 | 864 | ||
865 | /* the struct for codec->pin_configs */ | ||
866 | struct hda_pincfg { | ||
867 | hda_nid_t nid; | ||
868 | unsigned int cfg; | ||
869 | }; | ||
870 | |||
871 | unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid); | ||
872 | int snd_hda_codec_set_pincfg(struct hda_codec *codec, hda_nid_t nid, | ||
873 | unsigned int cfg); | ||
874 | int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list, | ||
875 | hda_nid_t nid, unsigned int cfg); /* for hwdep */ | ||
876 | |||
857 | /* | 877 | /* |
858 | * Mixer | 878 | * Mixer |
859 | */ | 879 | */ |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 65745e96dc70..1d5797a96682 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -144,9 +144,9 @@ static int add_new_node(struct hda_codec *codec, struct hda_gspec *spec, hda_nid | |||
144 | node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | 144 | node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; |
145 | 145 | ||
146 | if (node->type == AC_WID_PIN) { | 146 | if (node->type == AC_WID_PIN) { |
147 | node->pin_caps = snd_hda_param_read(codec, node->nid, AC_PAR_PIN_CAP); | 147 | node->pin_caps = snd_hda_query_pin_caps(codec, node->nid); |
148 | node->pin_ctl = snd_hda_codec_read(codec, node->nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | 148 | node->pin_ctl = snd_hda_codec_read(codec, node->nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); |
149 | node->def_cfg = snd_hda_codec_read(codec, node->nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 149 | node->def_cfg = snd_hda_codec_get_pincfg(codec, node->nid); |
150 | } | 150 | } |
151 | 151 | ||
152 | if (node->wid_caps & AC_WCAP_OUT_AMP) { | 152 | if (node->wid_caps & AC_WCAP_OUT_AMP) { |
diff --git a/sound/pci/hda/hda_hwdep.c b/sound/pci/hda/hda_hwdep.c index 300ab407cf42..1c57505c2874 100644 --- a/sound/pci/hda/hda_hwdep.c +++ b/sound/pci/hda/hda_hwdep.c | |||
@@ -30,6 +30,12 @@ | |||
30 | #include <sound/hda_hwdep.h> | 30 | #include <sound/hda_hwdep.h> |
31 | #include <sound/minors.h> | 31 | #include <sound/minors.h> |
32 | 32 | ||
33 | /* hint string pair */ | ||
34 | struct hda_hint { | ||
35 | const char *key; | ||
36 | const char *val; /* contained in the same alloc as key */ | ||
37 | }; | ||
38 | |||
33 | /* | 39 | /* |
34 | * write/read an out-of-bound verb | 40 | * write/read an out-of-bound verb |
35 | */ | 41 | */ |
@@ -99,16 +105,17 @@ static int hda_hwdep_open(struct snd_hwdep *hw, struct file *file) | |||
99 | 105 | ||
100 | static void clear_hwdep_elements(struct hda_codec *codec) | 106 | static void clear_hwdep_elements(struct hda_codec *codec) |
101 | { | 107 | { |
102 | char **head; | ||
103 | int i; | 108 | int i; |
104 | 109 | ||
105 | /* clear init verbs */ | 110 | /* clear init verbs */ |
106 | snd_array_free(&codec->init_verbs); | 111 | snd_array_free(&codec->init_verbs); |
107 | /* clear hints */ | 112 | /* clear hints */ |
108 | head = codec->hints.list; | 113 | for (i = 0; i < codec->hints.used; i++) { |
109 | for (i = 0; i < codec->hints.used; i++, head++) | 114 | struct hda_hint *hint = snd_array_elem(&codec->hints, i); |
110 | kfree(*head); | 115 | kfree(hint->key); /* we don't need to free hint->val */ |
116 | } | ||
111 | snd_array_free(&codec->hints); | 117 | snd_array_free(&codec->hints); |
118 | snd_array_free(&codec->user_pins); | ||
112 | } | 119 | } |
113 | 120 | ||
114 | static void hwdep_free(struct snd_hwdep *hwdep) | 121 | static void hwdep_free(struct snd_hwdep *hwdep) |
@@ -140,7 +147,8 @@ int /*__devinit*/ snd_hda_create_hwdep(struct hda_codec *codec) | |||
140 | #endif | 147 | #endif |
141 | 148 | ||
142 | snd_array_init(&codec->init_verbs, sizeof(struct hda_verb), 32); | 149 | snd_array_init(&codec->init_verbs, sizeof(struct hda_verb), 32); |
143 | snd_array_init(&codec->hints, sizeof(char *), 32); | 150 | snd_array_init(&codec->hints, sizeof(struct hda_hint), 32); |
151 | snd_array_init(&codec->user_pins, sizeof(struct hda_pincfg), 16); | ||
144 | 152 | ||
145 | return 0; | 153 | return 0; |
146 | } | 154 | } |
@@ -153,7 +161,13 @@ int /*__devinit*/ snd_hda_create_hwdep(struct hda_codec *codec) | |||
153 | 161 | ||
154 | static int clear_codec(struct hda_codec *codec) | 162 | static int clear_codec(struct hda_codec *codec) |
155 | { | 163 | { |
156 | snd_hda_codec_reset(codec); | 164 | int err; |
165 | |||
166 | err = snd_hda_codec_reset(codec); | ||
167 | if (err < 0) { | ||
168 | snd_printk(KERN_ERR "The codec is being used, can't free.\n"); | ||
169 | return err; | ||
170 | } | ||
157 | clear_hwdep_elements(codec); | 171 | clear_hwdep_elements(codec); |
158 | return 0; | 172 | return 0; |
159 | } | 173 | } |
@@ -162,20 +176,29 @@ static int reconfig_codec(struct hda_codec *codec) | |||
162 | { | 176 | { |
163 | int err; | 177 | int err; |
164 | 178 | ||
179 | snd_hda_power_up(codec); | ||
165 | snd_printk(KERN_INFO "hda-codec: reconfiguring\n"); | 180 | snd_printk(KERN_INFO "hda-codec: reconfiguring\n"); |
166 | snd_hda_codec_reset(codec); | 181 | err = snd_hda_codec_reset(codec); |
182 | if (err < 0) { | ||
183 | snd_printk(KERN_ERR | ||
184 | "The codec is being used, can't reconfigure.\n"); | ||
185 | goto error; | ||
186 | } | ||
167 | err = snd_hda_codec_configure(codec); | 187 | err = snd_hda_codec_configure(codec); |
168 | if (err < 0) | 188 | if (err < 0) |
169 | return err; | 189 | goto error; |
170 | /* rebuild PCMs */ | 190 | /* rebuild PCMs */ |
171 | err = snd_hda_codec_build_pcms(codec); | 191 | err = snd_hda_codec_build_pcms(codec); |
172 | if (err < 0) | 192 | if (err < 0) |
173 | return err; | 193 | goto error; |
174 | /* rebuild mixers */ | 194 | /* rebuild mixers */ |
175 | err = snd_hda_codec_build_controls(codec); | 195 | err = snd_hda_codec_build_controls(codec); |
176 | if (err < 0) | 196 | if (err < 0) |
177 | return err; | 197 | goto error; |
178 | return 0; | 198 | err = snd_card_register(codec->bus->card); |
199 | error: | ||
200 | snd_hda_power_down(codec); | ||
201 | return err; | ||
179 | } | 202 | } |
180 | 203 | ||
181 | /* | 204 | /* |
@@ -271,47 +294,195 @@ static ssize_t type##_store(struct device *dev, \ | |||
271 | CODEC_ACTION_STORE(reconfig); | 294 | CODEC_ACTION_STORE(reconfig); |
272 | CODEC_ACTION_STORE(clear); | 295 | CODEC_ACTION_STORE(clear); |
273 | 296 | ||
297 | static ssize_t init_verbs_show(struct device *dev, | ||
298 | struct device_attribute *attr, | ||
299 | char *buf) | ||
300 | { | ||
301 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
302 | struct hda_codec *codec = hwdep->private_data; | ||
303 | int i, len = 0; | ||
304 | for (i = 0; i < codec->init_verbs.used; i++) { | ||
305 | struct hda_verb *v = snd_array_elem(&codec->init_verbs, i); | ||
306 | len += snprintf(buf + len, PAGE_SIZE - len, | ||
307 | "0x%02x 0x%03x 0x%04x\n", | ||
308 | v->nid, v->verb, v->param); | ||
309 | } | ||
310 | return len; | ||
311 | } | ||
312 | |||
274 | static ssize_t init_verbs_store(struct device *dev, | 313 | static ssize_t init_verbs_store(struct device *dev, |
275 | struct device_attribute *attr, | 314 | struct device_attribute *attr, |
276 | const char *buf, size_t count) | 315 | const char *buf, size_t count) |
277 | { | 316 | { |
278 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | 317 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); |
279 | struct hda_codec *codec = hwdep->private_data; | 318 | struct hda_codec *codec = hwdep->private_data; |
280 | char *p; | 319 | struct hda_verb *v; |
281 | struct hda_verb verb, *v; | 320 | int nid, verb, param; |
282 | 321 | ||
283 | verb.nid = simple_strtoul(buf, &p, 0); | 322 | if (sscanf(buf, "%i %i %i", &nid, &verb, ¶m) != 3) |
284 | verb.verb = simple_strtoul(p, &p, 0); | 323 | return -EINVAL; |
285 | verb.param = simple_strtoul(p, &p, 0); | 324 | if (!nid || !verb) |
286 | if (!verb.nid || !verb.verb || !verb.param) | ||
287 | return -EINVAL; | 325 | return -EINVAL; |
288 | v = snd_array_new(&codec->init_verbs); | 326 | v = snd_array_new(&codec->init_verbs); |
289 | if (!v) | 327 | if (!v) |
290 | return -ENOMEM; | 328 | return -ENOMEM; |
291 | *v = verb; | 329 | v->nid = nid; |
330 | v->verb = verb; | ||
331 | v->param = param; | ||
292 | return count; | 332 | return count; |
293 | } | 333 | } |
294 | 334 | ||
335 | static ssize_t hints_show(struct device *dev, | ||
336 | struct device_attribute *attr, | ||
337 | char *buf) | ||
338 | { | ||
339 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
340 | struct hda_codec *codec = hwdep->private_data; | ||
341 | int i, len = 0; | ||
342 | for (i = 0; i < codec->hints.used; i++) { | ||
343 | struct hda_hint *hint = snd_array_elem(&codec->hints, i); | ||
344 | len += snprintf(buf + len, PAGE_SIZE - len, | ||
345 | "%s = %s\n", hint->key, hint->val); | ||
346 | } | ||
347 | return len; | ||
348 | } | ||
349 | |||
350 | static struct hda_hint *get_hint(struct hda_codec *codec, const char *key) | ||
351 | { | ||
352 | int i; | ||
353 | |||
354 | for (i = 0; i < codec->hints.used; i++) { | ||
355 | struct hda_hint *hint = snd_array_elem(&codec->hints, i); | ||
356 | if (!strcmp(hint->key, key)) | ||
357 | return hint; | ||
358 | } | ||
359 | return NULL; | ||
360 | } | ||
361 | |||
362 | static void remove_trail_spaces(char *str) | ||
363 | { | ||
364 | char *p; | ||
365 | if (!*str) | ||
366 | return; | ||
367 | p = str + strlen(str) - 1; | ||
368 | for (; isspace(*p); p--) { | ||
369 | *p = 0; | ||
370 | if (p == str) | ||
371 | return; | ||
372 | } | ||
373 | } | ||
374 | |||
375 | #define MAX_HINTS 1024 | ||
376 | |||
295 | static ssize_t hints_store(struct device *dev, | 377 | static ssize_t hints_store(struct device *dev, |
296 | struct device_attribute *attr, | 378 | struct device_attribute *attr, |
297 | const char *buf, size_t count) | 379 | const char *buf, size_t count) |
298 | { | 380 | { |
299 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | 381 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); |
300 | struct hda_codec *codec = hwdep->private_data; | 382 | struct hda_codec *codec = hwdep->private_data; |
301 | char *p; | 383 | char *key, *val; |
302 | char **hint; | 384 | struct hda_hint *hint; |
303 | 385 | ||
304 | if (!*buf || isspace(*buf) || *buf == '#' || *buf == '\n') | 386 | while (isspace(*buf)) |
387 | buf++; | ||
388 | if (!*buf || *buf == '#' || *buf == '\n') | ||
305 | return count; | 389 | return count; |
306 | p = kstrndup_noeol(buf, 1024); | 390 | if (*buf == '=') |
307 | if (!p) | 391 | return -EINVAL; |
392 | key = kstrndup_noeol(buf, 1024); | ||
393 | if (!key) | ||
308 | return -ENOMEM; | 394 | return -ENOMEM; |
309 | hint = snd_array_new(&codec->hints); | 395 | /* extract key and val */ |
396 | val = strchr(key, '='); | ||
397 | if (!val) { | ||
398 | kfree(key); | ||
399 | return -EINVAL; | ||
400 | } | ||
401 | *val++ = 0; | ||
402 | while (isspace(*val)) | ||
403 | val++; | ||
404 | remove_trail_spaces(key); | ||
405 | remove_trail_spaces(val); | ||
406 | hint = get_hint(codec, key); | ||
407 | if (hint) { | ||
408 | /* replace */ | ||
409 | kfree(hint->key); | ||
410 | hint->key = key; | ||
411 | hint->val = val; | ||
412 | return count; | ||
413 | } | ||
414 | /* allocate a new hint entry */ | ||
415 | if (codec->hints.used >= MAX_HINTS) | ||
416 | hint = NULL; | ||
417 | else | ||
418 | hint = snd_array_new(&codec->hints); | ||
310 | if (!hint) { | 419 | if (!hint) { |
311 | kfree(p); | 420 | kfree(key); |
312 | return -ENOMEM; | 421 | return -ENOMEM; |
313 | } | 422 | } |
314 | *hint = p; | 423 | hint->key = key; |
424 | hint->val = val; | ||
425 | return count; | ||
426 | } | ||
427 | |||
428 | static ssize_t pin_configs_show(struct hda_codec *codec, | ||
429 | struct snd_array *list, | ||
430 | char *buf) | ||
431 | { | ||
432 | int i, len = 0; | ||
433 | for (i = 0; i < list->used; i++) { | ||
434 | struct hda_pincfg *pin = snd_array_elem(list, i); | ||
435 | len += sprintf(buf + len, "0x%02x 0x%08x\n", | ||
436 | pin->nid, pin->cfg); | ||
437 | } | ||
438 | return len; | ||
439 | } | ||
440 | |||
441 | static ssize_t init_pin_configs_show(struct device *dev, | ||
442 | struct device_attribute *attr, | ||
443 | char *buf) | ||
444 | { | ||
445 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
446 | struct hda_codec *codec = hwdep->private_data; | ||
447 | return pin_configs_show(codec, &codec->init_pins, buf); | ||
448 | } | ||
449 | |||
450 | static ssize_t user_pin_configs_show(struct device *dev, | ||
451 | struct device_attribute *attr, | ||
452 | char *buf) | ||
453 | { | ||
454 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
455 | struct hda_codec *codec = hwdep->private_data; | ||
456 | return pin_configs_show(codec, &codec->user_pins, buf); | ||
457 | } | ||
458 | |||
459 | static ssize_t driver_pin_configs_show(struct device *dev, | ||
460 | struct device_attribute *attr, | ||
461 | char *buf) | ||
462 | { | ||
463 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
464 | struct hda_codec *codec = hwdep->private_data; | ||
465 | return pin_configs_show(codec, &codec->driver_pins, buf); | ||
466 | } | ||
467 | |||
468 | #define MAX_PIN_CONFIGS 32 | ||
469 | |||
470 | static ssize_t user_pin_configs_store(struct device *dev, | ||
471 | struct device_attribute *attr, | ||
472 | const char *buf, size_t count) | ||
473 | { | ||
474 | struct snd_hwdep *hwdep = dev_get_drvdata(dev); | ||
475 | struct hda_codec *codec = hwdep->private_data; | ||
476 | int nid, cfg; | ||
477 | int err; | ||
478 | |||
479 | if (sscanf(buf, "%i %i", &nid, &cfg) != 2) | ||
480 | return -EINVAL; | ||
481 | if (!nid) | ||
482 | return -EINVAL; | ||
483 | err = snd_hda_add_pincfg(codec, &codec->user_pins, nid, cfg); | ||
484 | if (err < 0) | ||
485 | return err; | ||
315 | return count; | 486 | return count; |
316 | } | 487 | } |
317 | 488 | ||
@@ -330,8 +501,11 @@ static struct device_attribute codec_attrs[] = { | |||
330 | CODEC_ATTR_RO(mfg), | 501 | CODEC_ATTR_RO(mfg), |
331 | CODEC_ATTR_RW(name), | 502 | CODEC_ATTR_RW(name), |
332 | CODEC_ATTR_RW(modelname), | 503 | CODEC_ATTR_RW(modelname), |
333 | CODEC_ATTR_WO(init_verbs), | 504 | CODEC_ATTR_RW(init_verbs), |
334 | CODEC_ATTR_WO(hints), | 505 | CODEC_ATTR_RW(hints), |
506 | CODEC_ATTR_RO(init_pin_configs), | ||
507 | CODEC_ATTR_RW(user_pin_configs), | ||
508 | CODEC_ATTR_RO(driver_pin_configs), | ||
335 | CODEC_ATTR_WO(reconfig), | 509 | CODEC_ATTR_WO(reconfig), |
336 | CODEC_ATTR_WO(clear), | 510 | CODEC_ATTR_WO(clear), |
337 | }; | 511 | }; |
@@ -350,4 +524,29 @@ int snd_hda_hwdep_add_sysfs(struct hda_codec *codec) | |||
350 | return 0; | 524 | return 0; |
351 | } | 525 | } |
352 | 526 | ||
527 | /* | ||
528 | * Look for hint string | ||
529 | */ | ||
530 | const char *snd_hda_get_hint(struct hda_codec *codec, const char *key) | ||
531 | { | ||
532 | struct hda_hint *hint = get_hint(codec, key); | ||
533 | return hint ? hint->val : NULL; | ||
534 | } | ||
535 | EXPORT_SYMBOL_HDA(snd_hda_get_hint); | ||
536 | |||
537 | int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key) | ||
538 | { | ||
539 | const char *p = snd_hda_get_hint(codec, key); | ||
540 | if (!p || !*p) | ||
541 | return -ENOENT; | ||
542 | switch (toupper(*p)) { | ||
543 | case 'T': /* true */ | ||
544 | case 'Y': /* yes */ | ||
545 | case '1': | ||
546 | return 1; | ||
547 | } | ||
548 | return 0; | ||
549 | } | ||
550 | EXPORT_SYMBOL_HDA(snd_hda_get_bool_hint); | ||
551 | |||
353 | #endif /* CONFIG_SND_HDA_RECONFIG */ | 552 | #endif /* CONFIG_SND_HDA_RECONFIG */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index f9603443f086..21e99cfa8c49 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -312,6 +312,8 @@ struct azx_dev { | |||
312 | unsigned int period_bytes; /* size of the period in bytes */ | 312 | unsigned int period_bytes; /* size of the period in bytes */ |
313 | unsigned int frags; /* number for period in the play buffer */ | 313 | unsigned int frags; /* number for period in the play buffer */ |
314 | unsigned int fifo_size; /* FIFO size */ | 314 | unsigned int fifo_size; /* FIFO size */ |
315 | unsigned long start_jiffies; /* start + minimum jiffies */ | ||
316 | unsigned long min_jiffies; /* minimum jiffies before position is valid */ | ||
315 | 317 | ||
316 | void __iomem *sd_addr; /* stream descriptor pointer */ | 318 | void __iomem *sd_addr; /* stream descriptor pointer */ |
317 | 319 | ||
@@ -330,7 +332,7 @@ struct azx_dev { | |||
330 | unsigned int opened :1; | 332 | unsigned int opened :1; |
331 | unsigned int running :1; | 333 | unsigned int running :1; |
332 | unsigned int irq_pending :1; | 334 | unsigned int irq_pending :1; |
333 | unsigned int irq_ignore :1; | 335 | unsigned int start_flag: 1; /* stream full start flag */ |
334 | /* | 336 | /* |
335 | * For VIA: | 337 | * For VIA: |
336 | * A flag to ensure DMA position is 0 | 338 | * A flag to ensure DMA position is 0 |
@@ -381,6 +383,7 @@ struct azx { | |||
381 | 383 | ||
382 | /* HD codec */ | 384 | /* HD codec */ |
383 | unsigned short codec_mask; | 385 | unsigned short codec_mask; |
386 | int codec_probe_mask; /* copied from probe_mask option */ | ||
384 | struct hda_bus *bus; | 387 | struct hda_bus *bus; |
385 | 388 | ||
386 | /* CORB/RIRB */ | 389 | /* CORB/RIRB */ |
@@ -858,13 +861,18 @@ static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev) | |||
858 | SD_CTL_DMA_START | SD_INT_MASK); | 861 | SD_CTL_DMA_START | SD_INT_MASK); |
859 | } | 862 | } |
860 | 863 | ||
861 | /* stop a stream */ | 864 | /* stop DMA */ |
862 | static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev) | 865 | static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev) |
863 | { | 866 | { |
864 | /* stop DMA */ | ||
865 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) & | 867 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) & |
866 | ~(SD_CTL_DMA_START | SD_INT_MASK)); | 868 | ~(SD_CTL_DMA_START | SD_INT_MASK)); |
867 | azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */ | 869 | azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */ |
870 | } | ||
871 | |||
872 | /* stop a stream */ | ||
873 | static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev) | ||
874 | { | ||
875 | azx_stream_clear(chip, azx_dev); | ||
868 | /* disable SIE */ | 876 | /* disable SIE */ |
869 | azx_writeb(chip, INTCTL, | 877 | azx_writeb(chip, INTCTL, |
870 | azx_readb(chip, INTCTL) & ~(1 << azx_dev->index)); | 878 | azx_readb(chip, INTCTL) & ~(1 << azx_dev->index)); |
@@ -969,7 +977,7 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) | |||
969 | struct azx *chip = dev_id; | 977 | struct azx *chip = dev_id; |
970 | struct azx_dev *azx_dev; | 978 | struct azx_dev *azx_dev; |
971 | u32 status; | 979 | u32 status; |
972 | int i; | 980 | int i, ok; |
973 | 981 | ||
974 | spin_lock(&chip->reg_lock); | 982 | spin_lock(&chip->reg_lock); |
975 | 983 | ||
@@ -985,18 +993,14 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) | |||
985 | azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); | 993 | azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); |
986 | if (!azx_dev->substream || !azx_dev->running) | 994 | if (!azx_dev->substream || !azx_dev->running) |
987 | continue; | 995 | continue; |
988 | /* ignore the first dummy IRQ (due to pos_adj) */ | ||
989 | if (azx_dev->irq_ignore) { | ||
990 | azx_dev->irq_ignore = 0; | ||
991 | continue; | ||
992 | } | ||
993 | /* check whether this IRQ is really acceptable */ | 996 | /* check whether this IRQ is really acceptable */ |
994 | if (azx_position_ok(chip, azx_dev)) { | 997 | ok = azx_position_ok(chip, azx_dev); |
998 | if (ok == 1) { | ||
995 | azx_dev->irq_pending = 0; | 999 | azx_dev->irq_pending = 0; |
996 | spin_unlock(&chip->reg_lock); | 1000 | spin_unlock(&chip->reg_lock); |
997 | snd_pcm_period_elapsed(azx_dev->substream); | 1001 | snd_pcm_period_elapsed(azx_dev->substream); |
998 | spin_lock(&chip->reg_lock); | 1002 | spin_lock(&chip->reg_lock); |
999 | } else if (chip->bus && chip->bus->workq) { | 1003 | } else if (ok == 0 && chip->bus && chip->bus->workq) { |
1000 | /* bogus IRQ, process it later */ | 1004 | /* bogus IRQ, process it later */ |
1001 | azx_dev->irq_pending = 1; | 1005 | azx_dev->irq_pending = 1; |
1002 | queue_work(chip->bus->workq, | 1006 | queue_work(chip->bus->workq, |
@@ -1075,15 +1079,13 @@ static int azx_setup_periods(struct azx *chip, | |||
1075 | azx_sd_writel(azx_dev, SD_BDLPL, 0); | 1079 | azx_sd_writel(azx_dev, SD_BDLPL, 0); |
1076 | azx_sd_writel(azx_dev, SD_BDLPU, 0); | 1080 | azx_sd_writel(azx_dev, SD_BDLPU, 0); |
1077 | 1081 | ||
1078 | period_bytes = snd_pcm_lib_period_bytes(substream); | 1082 | period_bytes = azx_dev->period_bytes; |
1079 | azx_dev->period_bytes = period_bytes; | ||
1080 | periods = azx_dev->bufsize / period_bytes; | 1083 | periods = azx_dev->bufsize / period_bytes; |
1081 | 1084 | ||
1082 | /* program the initial BDL entries */ | 1085 | /* program the initial BDL entries */ |
1083 | bdl = (u32 *)azx_dev->bdl.area; | 1086 | bdl = (u32 *)azx_dev->bdl.area; |
1084 | ofs = 0; | 1087 | ofs = 0; |
1085 | azx_dev->frags = 0; | 1088 | azx_dev->frags = 0; |
1086 | azx_dev->irq_ignore = 0; | ||
1087 | pos_adj = bdl_pos_adj[chip->dev_index]; | 1089 | pos_adj = bdl_pos_adj[chip->dev_index]; |
1088 | if (pos_adj > 0) { | 1090 | if (pos_adj > 0) { |
1089 | struct snd_pcm_runtime *runtime = substream->runtime; | 1091 | struct snd_pcm_runtime *runtime = substream->runtime; |
@@ -1104,7 +1106,6 @@ static int azx_setup_periods(struct azx *chip, | |||
1104 | &bdl, ofs, pos_adj, 1); | 1106 | &bdl, ofs, pos_adj, 1); |
1105 | if (ofs < 0) | 1107 | if (ofs < 0) |
1106 | goto error; | 1108 | goto error; |
1107 | azx_dev->irq_ignore = 1; | ||
1108 | } | 1109 | } |
1109 | } else | 1110 | } else |
1110 | pos_adj = 0; | 1111 | pos_adj = 0; |
@@ -1123,24 +1124,17 @@ static int azx_setup_periods(struct azx *chip, | |||
1123 | error: | 1124 | error: |
1124 | snd_printk(KERN_ERR "Too many BDL entries: buffer=%d, period=%d\n", | 1125 | snd_printk(KERN_ERR "Too many BDL entries: buffer=%d, period=%d\n", |
1125 | azx_dev->bufsize, period_bytes); | 1126 | azx_dev->bufsize, period_bytes); |
1126 | /* reset */ | ||
1127 | azx_sd_writel(azx_dev, SD_BDLPL, 0); | ||
1128 | azx_sd_writel(azx_dev, SD_BDLPU, 0); | ||
1129 | return -EINVAL; | 1127 | return -EINVAL; |
1130 | } | 1128 | } |
1131 | 1129 | ||
1132 | /* | 1130 | /* reset stream */ |
1133 | * set up the SD for streaming | 1131 | static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev) |
1134 | */ | ||
1135 | static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev) | ||
1136 | { | 1132 | { |
1137 | unsigned char val; | 1133 | unsigned char val; |
1138 | int timeout; | 1134 | int timeout; |
1139 | 1135 | ||
1140 | /* make sure the run bit is zero for SD */ | 1136 | azx_stream_clear(chip, azx_dev); |
1141 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) & | 1137 | |
1142 | ~SD_CTL_DMA_START); | ||
1143 | /* reset stream */ | ||
1144 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) | | 1138 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) | |
1145 | SD_CTL_STREAM_RESET); | 1139 | SD_CTL_STREAM_RESET); |
1146 | udelay(3); | 1140 | udelay(3); |
@@ -1158,6 +1152,17 @@ static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev) | |||
1158 | --timeout) | 1152 | --timeout) |
1159 | ; | 1153 | ; |
1160 | 1154 | ||
1155 | /* reset first position - may not be synced with hw at this time */ | ||
1156 | *azx_dev->posbuf = 0; | ||
1157 | } | ||
1158 | |||
1159 | /* | ||
1160 | * set up the SD for streaming | ||
1161 | */ | ||
1162 | static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev) | ||
1163 | { | ||
1164 | /* make sure the run bit is zero for SD */ | ||
1165 | azx_stream_clear(chip, azx_dev); | ||
1161 | /* program the stream_tag */ | 1166 | /* program the stream_tag */ |
1162 | azx_sd_writel(azx_dev, SD_CTL, | 1167 | azx_sd_writel(azx_dev, SD_CTL, |
1163 | (azx_sd_readl(azx_dev, SD_CTL) & ~SD_CTL_STREAM_TAG_MASK)| | 1168 | (azx_sd_readl(azx_dev, SD_CTL) & ~SD_CTL_STREAM_TAG_MASK)| |
@@ -1228,7 +1233,6 @@ static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] __devinitdata = { | |||
1228 | }; | 1233 | }; |
1229 | 1234 | ||
1230 | static int __devinit azx_codec_create(struct azx *chip, const char *model, | 1235 | static int __devinit azx_codec_create(struct azx *chip, const char *model, |
1231 | unsigned int codec_probe_mask, | ||
1232 | int no_init) | 1236 | int no_init) |
1233 | { | 1237 | { |
1234 | struct hda_bus_template bus_temp; | 1238 | struct hda_bus_template bus_temp; |
@@ -1261,7 +1265,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model, | |||
1261 | 1265 | ||
1262 | /* First try to probe all given codec slots */ | 1266 | /* First try to probe all given codec slots */ |
1263 | for (c = 0; c < max_slots; c++) { | 1267 | for (c = 0; c < max_slots; c++) { |
1264 | if ((chip->codec_mask & (1 << c)) & codec_probe_mask) { | 1268 | if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { |
1265 | if (probe_codec(chip, c) < 0) { | 1269 | if (probe_codec(chip, c) < 0) { |
1266 | /* Some BIOSen give you wrong codec addresses | 1270 | /* Some BIOSen give you wrong codec addresses |
1267 | * that don't exist | 1271 | * that don't exist |
@@ -1285,7 +1289,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model, | |||
1285 | 1289 | ||
1286 | /* Then create codec instances */ | 1290 | /* Then create codec instances */ |
1287 | for (c = 0; c < max_slots; c++) { | 1291 | for (c = 0; c < max_slots; c++) { |
1288 | if ((chip->codec_mask & (1 << c)) & codec_probe_mask) { | 1292 | if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { |
1289 | struct hda_codec *codec; | 1293 | struct hda_codec *codec; |
1290 | err = snd_hda_codec_new(chip->bus, c, !no_init, &codec); | 1294 | err = snd_hda_codec_new(chip->bus, c, !no_init, &codec); |
1291 | if (err < 0) | 1295 | if (err < 0) |
@@ -1403,6 +1407,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
1403 | runtime->private_data = azx_dev; | 1407 | runtime->private_data = azx_dev; |
1404 | snd_pcm_set_sync(substream); | 1408 | snd_pcm_set_sync(substream); |
1405 | mutex_unlock(&chip->open_mutex); | 1409 | mutex_unlock(&chip->open_mutex); |
1410 | |||
1406 | return 0; | 1411 | return 0; |
1407 | } | 1412 | } |
1408 | 1413 | ||
@@ -1429,6 +1434,11 @@ static int azx_pcm_close(struct snd_pcm_substream *substream) | |||
1429 | static int azx_pcm_hw_params(struct snd_pcm_substream *substream, | 1434 | static int azx_pcm_hw_params(struct snd_pcm_substream *substream, |
1430 | struct snd_pcm_hw_params *hw_params) | 1435 | struct snd_pcm_hw_params *hw_params) |
1431 | { | 1436 | { |
1437 | struct azx_dev *azx_dev = get_azx_dev(substream); | ||
1438 | |||
1439 | azx_dev->bufsize = 0; | ||
1440 | azx_dev->period_bytes = 0; | ||
1441 | azx_dev->format_val = 0; | ||
1432 | return snd_pcm_lib_malloc_pages(substream, | 1442 | return snd_pcm_lib_malloc_pages(substream, |
1433 | params_buffer_bytes(hw_params)); | 1443 | params_buffer_bytes(hw_params)); |
1434 | } | 1444 | } |
@@ -1443,6 +1453,9 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) | |||
1443 | azx_sd_writel(azx_dev, SD_BDLPL, 0); | 1453 | azx_sd_writel(azx_dev, SD_BDLPL, 0); |
1444 | azx_sd_writel(azx_dev, SD_BDLPU, 0); | 1454 | azx_sd_writel(azx_dev, SD_BDLPU, 0); |
1445 | azx_sd_writel(azx_dev, SD_CTL, 0); | 1455 | azx_sd_writel(azx_dev, SD_CTL, 0); |
1456 | azx_dev->bufsize = 0; | ||
1457 | azx_dev->period_bytes = 0; | ||
1458 | azx_dev->format_val = 0; | ||
1446 | 1459 | ||
1447 | hinfo->ops.cleanup(hinfo, apcm->codec, substream); | 1460 | hinfo->ops.cleanup(hinfo, apcm->codec, substream); |
1448 | 1461 | ||
@@ -1456,23 +1469,40 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
1456 | struct azx_dev *azx_dev = get_azx_dev(substream); | 1469 | struct azx_dev *azx_dev = get_azx_dev(substream); |
1457 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; | 1470 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; |
1458 | struct snd_pcm_runtime *runtime = substream->runtime; | 1471 | struct snd_pcm_runtime *runtime = substream->runtime; |
1472 | unsigned int bufsize, period_bytes, format_val; | ||
1473 | int err; | ||
1459 | 1474 | ||
1460 | azx_dev->bufsize = snd_pcm_lib_buffer_bytes(substream); | 1475 | azx_stream_reset(chip, azx_dev); |
1461 | azx_dev->format_val = snd_hda_calc_stream_format(runtime->rate, | 1476 | format_val = snd_hda_calc_stream_format(runtime->rate, |
1462 | runtime->channels, | 1477 | runtime->channels, |
1463 | runtime->format, | 1478 | runtime->format, |
1464 | hinfo->maxbps); | 1479 | hinfo->maxbps); |
1465 | if (!azx_dev->format_val) { | 1480 | if (!format_val) { |
1466 | snd_printk(KERN_ERR SFX | 1481 | snd_printk(KERN_ERR SFX |
1467 | "invalid format_val, rate=%d, ch=%d, format=%d\n", | 1482 | "invalid format_val, rate=%d, ch=%d, format=%d\n", |
1468 | runtime->rate, runtime->channels, runtime->format); | 1483 | runtime->rate, runtime->channels, runtime->format); |
1469 | return -EINVAL; | 1484 | return -EINVAL; |
1470 | } | 1485 | } |
1471 | 1486 | ||
1487 | bufsize = snd_pcm_lib_buffer_bytes(substream); | ||
1488 | period_bytes = snd_pcm_lib_period_bytes(substream); | ||
1489 | |||
1472 | snd_printdd("azx_pcm_prepare: bufsize=0x%x, format=0x%x\n", | 1490 | snd_printdd("azx_pcm_prepare: bufsize=0x%x, format=0x%x\n", |
1473 | azx_dev->bufsize, azx_dev->format_val); | 1491 | bufsize, format_val); |
1474 | if (azx_setup_periods(chip, substream, azx_dev) < 0) | 1492 | |
1475 | return -EINVAL; | 1493 | if (bufsize != azx_dev->bufsize || |
1494 | period_bytes != azx_dev->period_bytes || | ||
1495 | format_val != azx_dev->format_val) { | ||
1496 | azx_dev->bufsize = bufsize; | ||
1497 | azx_dev->period_bytes = period_bytes; | ||
1498 | azx_dev->format_val = format_val; | ||
1499 | err = azx_setup_periods(chip, substream, azx_dev); | ||
1500 | if (err < 0) | ||
1501 | return err; | ||
1502 | } | ||
1503 | |||
1504 | azx_dev->min_jiffies = (runtime->period_size * HZ) / | ||
1505 | (runtime->rate * 2); | ||
1476 | azx_setup_controller(chip, azx_dev); | 1506 | azx_setup_controller(chip, azx_dev); |
1477 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 1507 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
1478 | azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1; | 1508 | azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1; |
@@ -1489,13 +1519,14 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | |||
1489 | struct azx *chip = apcm->chip; | 1519 | struct azx *chip = apcm->chip; |
1490 | struct azx_dev *azx_dev; | 1520 | struct azx_dev *azx_dev; |
1491 | struct snd_pcm_substream *s; | 1521 | struct snd_pcm_substream *s; |
1492 | int start, nsync = 0, sbits = 0; | 1522 | int rstart = 0, start, nsync = 0, sbits = 0; |
1493 | int nwait, timeout; | 1523 | int nwait, timeout; |
1494 | 1524 | ||
1495 | switch (cmd) { | 1525 | switch (cmd) { |
1526 | case SNDRV_PCM_TRIGGER_START: | ||
1527 | rstart = 1; | ||
1496 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 1528 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
1497 | case SNDRV_PCM_TRIGGER_RESUME: | 1529 | case SNDRV_PCM_TRIGGER_RESUME: |
1498 | case SNDRV_PCM_TRIGGER_START: | ||
1499 | start = 1; | 1530 | start = 1; |
1500 | break; | 1531 | break; |
1501 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 1532 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
@@ -1525,6 +1556,10 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | |||
1525 | if (s->pcm->card != substream->pcm->card) | 1556 | if (s->pcm->card != substream->pcm->card) |
1526 | continue; | 1557 | continue; |
1527 | azx_dev = get_azx_dev(s); | 1558 | azx_dev = get_azx_dev(s); |
1559 | if (rstart) { | ||
1560 | azx_dev->start_flag = 1; | ||
1561 | azx_dev->start_jiffies = jiffies + azx_dev->min_jiffies; | ||
1562 | } | ||
1528 | if (start) | 1563 | if (start) |
1529 | azx_stream_start(chip, azx_dev); | 1564 | azx_stream_start(chip, azx_dev); |
1530 | else | 1565 | else |
@@ -1674,6 +1709,11 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) | |||
1674 | { | 1709 | { |
1675 | unsigned int pos; | 1710 | unsigned int pos; |
1676 | 1711 | ||
1712 | if (azx_dev->start_flag && | ||
1713 | time_before_eq(jiffies, azx_dev->start_jiffies)) | ||
1714 | return -1; /* bogus (too early) interrupt */ | ||
1715 | azx_dev->start_flag = 0; | ||
1716 | |||
1677 | pos = azx_get_position(chip, azx_dev); | 1717 | pos = azx_get_position(chip, azx_dev); |
1678 | if (chip->position_fix == POS_FIX_AUTO) { | 1718 | if (chip->position_fix == POS_FIX_AUTO) { |
1679 | if (!pos) { | 1719 | if (!pos) { |
@@ -1947,16 +1987,13 @@ static int azx_suspend(struct pci_dev *pci, pm_message_t state) | |||
1947 | return 0; | 1987 | return 0; |
1948 | } | 1988 | } |
1949 | 1989 | ||
1950 | static int azx_resume_early(struct pci_dev *pci) | ||
1951 | { | ||
1952 | return pci_restore_state(pci); | ||
1953 | } | ||
1954 | |||
1955 | static int azx_resume(struct pci_dev *pci) | 1990 | static int azx_resume(struct pci_dev *pci) |
1956 | { | 1991 | { |
1957 | struct snd_card *card = pci_get_drvdata(pci); | 1992 | struct snd_card *card = pci_get_drvdata(pci); |
1958 | struct azx *chip = card->private_data; | 1993 | struct azx *chip = card->private_data; |
1959 | 1994 | ||
1995 | pci_set_power_state(pci, PCI_D0); | ||
1996 | pci_restore_state(pci); | ||
1960 | if (pci_enable_device(pci) < 0) { | 1997 | if (pci_enable_device(pci) < 0) { |
1961 | printk(KERN_ERR "hda-intel: pci_enable_device failed, " | 1998 | printk(KERN_ERR "hda-intel: pci_enable_device failed, " |
1962 | "disabling device\n"); | 1999 | "disabling device\n"); |
@@ -2062,26 +2099,31 @@ static int __devinit check_position_fix(struct azx *chip, int fix) | |||
2062 | { | 2099 | { |
2063 | const struct snd_pci_quirk *q; | 2100 | const struct snd_pci_quirk *q; |
2064 | 2101 | ||
2065 | /* Check VIA HD Audio Controller exist */ | 2102 | switch (fix) { |
2066 | if (chip->pci->vendor == PCI_VENDOR_ID_VIA && | 2103 | case POS_FIX_LPIB: |
2067 | chip->pci->device == VIA_HDAC_DEVICE_ID) { | 2104 | case POS_FIX_POSBUF: |
2105 | return fix; | ||
2106 | } | ||
2107 | |||
2108 | /* Check VIA/ATI HD Audio Controller exist */ | ||
2109 | switch (chip->driver_type) { | ||
2110 | case AZX_DRIVER_VIA: | ||
2111 | case AZX_DRIVER_ATI: | ||
2068 | chip->via_dmapos_patch = 1; | 2112 | chip->via_dmapos_patch = 1; |
2069 | /* Use link position directly, avoid any transfer problem. */ | 2113 | /* Use link position directly, avoid any transfer problem. */ |
2070 | return POS_FIX_LPIB; | 2114 | return POS_FIX_LPIB; |
2071 | } | 2115 | } |
2072 | chip->via_dmapos_patch = 0; | 2116 | chip->via_dmapos_patch = 0; |
2073 | 2117 | ||
2074 | if (fix == POS_FIX_AUTO) { | 2118 | q = snd_pci_quirk_lookup(chip->pci, position_fix_list); |
2075 | q = snd_pci_quirk_lookup(chip->pci, position_fix_list); | 2119 | if (q) { |
2076 | if (q) { | 2120 | printk(KERN_INFO |
2077 | printk(KERN_INFO | 2121 | "hda_intel: position_fix set to %d " |
2078 | "hda_intel: position_fix set to %d " | 2122 | "for device %04x:%04x\n", |
2079 | "for device %04x:%04x\n", | 2123 | q->value, q->subvendor, q->subdevice); |
2080 | q->value, q->subvendor, q->subdevice); | 2124 | return q->value; |
2081 | return q->value; | ||
2082 | } | ||
2083 | } | 2125 | } |
2084 | return fix; | 2126 | return POS_FIX_AUTO; |
2085 | } | 2127 | } |
2086 | 2128 | ||
2087 | /* | 2129 | /* |
@@ -2098,23 +2140,36 @@ static struct snd_pci_quirk probe_mask_list[] __devinitdata = { | |||
2098 | SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01), | 2140 | SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01), |
2099 | /* including bogus ALC268 in slot#2 that conflicts with ALC888 */ | 2141 | /* including bogus ALC268 in slot#2 that conflicts with ALC888 */ |
2100 | SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01), | 2142 | SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01), |
2143 | /* forced codec slots */ | ||
2144 | SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), | ||
2101 | {} | 2145 | {} |
2102 | }; | 2146 | }; |
2103 | 2147 | ||
2148 | #define AZX_FORCE_CODEC_MASK 0x100 | ||
2149 | |||
2104 | static void __devinit check_probe_mask(struct azx *chip, int dev) | 2150 | static void __devinit check_probe_mask(struct azx *chip, int dev) |
2105 | { | 2151 | { |
2106 | const struct snd_pci_quirk *q; | 2152 | const struct snd_pci_quirk *q; |
2107 | 2153 | ||
2108 | if (probe_mask[dev] == -1) { | 2154 | chip->codec_probe_mask = probe_mask[dev]; |
2155 | if (chip->codec_probe_mask == -1) { | ||
2109 | q = snd_pci_quirk_lookup(chip->pci, probe_mask_list); | 2156 | q = snd_pci_quirk_lookup(chip->pci, probe_mask_list); |
2110 | if (q) { | 2157 | if (q) { |
2111 | printk(KERN_INFO | 2158 | printk(KERN_INFO |
2112 | "hda_intel: probe_mask set to 0x%x " | 2159 | "hda_intel: probe_mask set to 0x%x " |
2113 | "for device %04x:%04x\n", | 2160 | "for device %04x:%04x\n", |
2114 | q->value, q->subvendor, q->subdevice); | 2161 | q->value, q->subvendor, q->subdevice); |
2115 | probe_mask[dev] = q->value; | 2162 | chip->codec_probe_mask = q->value; |
2116 | } | 2163 | } |
2117 | } | 2164 | } |
2165 | |||
2166 | /* check forced option */ | ||
2167 | if (chip->codec_probe_mask != -1 && | ||
2168 | (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) { | ||
2169 | chip->codec_mask = chip->codec_probe_mask & 0xff; | ||
2170 | printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n", | ||
2171 | chip->codec_mask); | ||
2172 | } | ||
2118 | } | 2173 | } |
2119 | 2174 | ||
2120 | 2175 | ||
@@ -2211,9 +2266,17 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2211 | gcap = azx_readw(chip, GCAP); | 2266 | gcap = azx_readw(chip, GCAP); |
2212 | snd_printdd("chipset global capabilities = 0x%x\n", gcap); | 2267 | snd_printdd("chipset global capabilities = 0x%x\n", gcap); |
2213 | 2268 | ||
2269 | /* ATI chips seems buggy about 64bit DMA addresses */ | ||
2270 | if (chip->driver_type == AZX_DRIVER_ATI) | ||
2271 | gcap &= ~0x01; | ||
2272 | |||
2214 | /* allow 64bit DMA address if supported by H/W */ | 2273 | /* allow 64bit DMA address if supported by H/W */ |
2215 | if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) | 2274 | if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) |
2216 | pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); | 2275 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); |
2276 | else { | ||
2277 | pci_set_dma_mask(pci, DMA_BIT_MASK(32)); | ||
2278 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)); | ||
2279 | } | ||
2217 | 2280 | ||
2218 | /* read number of streams from GCAP register instead of using | 2281 | /* read number of streams from GCAP register instead of using |
2219 | * hardcoded value | 2282 | * hardcoded value |
@@ -2347,8 +2410,7 @@ static int __devinit azx_probe(struct pci_dev *pci, | |||
2347 | card->private_data = chip; | 2410 | card->private_data = chip; |
2348 | 2411 | ||
2349 | /* create codec instances */ | 2412 | /* create codec instances */ |
2350 | err = azx_codec_create(chip, model[dev], probe_mask[dev], | 2413 | err = azx_codec_create(chip, model[dev], probe_only[dev]); |
2351 | probe_only[dev]); | ||
2352 | if (err < 0) | 2414 | if (err < 0) |
2353 | goto out_free; | 2415 | goto out_free; |
2354 | 2416 | ||
@@ -2445,10 +2507,10 @@ static struct pci_device_id azx_ids[] = { | |||
2445 | { PCI_DEVICE(0x10de, 0x0ac1), .driver_data = AZX_DRIVER_NVIDIA }, | 2507 | { PCI_DEVICE(0x10de, 0x0ac1), .driver_data = AZX_DRIVER_NVIDIA }, |
2446 | { PCI_DEVICE(0x10de, 0x0ac2), .driver_data = AZX_DRIVER_NVIDIA }, | 2508 | { PCI_DEVICE(0x10de, 0x0ac2), .driver_data = AZX_DRIVER_NVIDIA }, |
2447 | { PCI_DEVICE(0x10de, 0x0ac3), .driver_data = AZX_DRIVER_NVIDIA }, | 2509 | { PCI_DEVICE(0x10de, 0x0ac3), .driver_data = AZX_DRIVER_NVIDIA }, |
2448 | { PCI_DEVICE(0x10de, 0x0bd4), .driver_data = AZX_DRIVER_NVIDIA }, | 2510 | { PCI_DEVICE(0x10de, 0x0d94), .driver_data = AZX_DRIVER_NVIDIA }, |
2449 | { PCI_DEVICE(0x10de, 0x0bd5), .driver_data = AZX_DRIVER_NVIDIA }, | 2511 | { PCI_DEVICE(0x10de, 0x0d95), .driver_data = AZX_DRIVER_NVIDIA }, |
2450 | { PCI_DEVICE(0x10de, 0x0bd6), .driver_data = AZX_DRIVER_NVIDIA }, | 2512 | { PCI_DEVICE(0x10de, 0x0d96), .driver_data = AZX_DRIVER_NVIDIA }, |
2451 | { PCI_DEVICE(0x10de, 0x0bd7), .driver_data = AZX_DRIVER_NVIDIA }, | 2513 | { PCI_DEVICE(0x10de, 0x0d97), .driver_data = AZX_DRIVER_NVIDIA }, |
2452 | /* Teradici */ | 2514 | /* Teradici */ |
2453 | { PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA }, | 2515 | { PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA }, |
2454 | /* AMD Generic, PCI class code and Vendor ID for HD Audio */ | 2516 | /* AMD Generic, PCI class code and Vendor ID for HD Audio */ |
@@ -2468,7 +2530,6 @@ static struct pci_driver driver = { | |||
2468 | .remove = __devexit_p(azx_remove), | 2530 | .remove = __devexit_p(azx_remove), |
2469 | #ifdef CONFIG_PM | 2531 | #ifdef CONFIG_PM |
2470 | .suspend = azx_suspend, | 2532 | .suspend = azx_suspend, |
2471 | .resume_early = azx_resume_early, | ||
2472 | .resume = azx_resume, | 2533 | .resume = azx_resume, |
2473 | #endif | 2534 | #endif |
2474 | }; | 2535 | }; |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 6f2fe0f9fdd8..83349013b4df 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
@@ -26,8 +26,10 @@ | |||
26 | /* | 26 | /* |
27 | * for mixer controls | 27 | * for mixer controls |
28 | */ | 28 | */ |
29 | #define HDA_COMPOSE_AMP_VAL_OFS(nid,chs,idx,dir,ofs) \ | ||
30 | ((nid) | ((chs)<<16) | ((dir)<<18) | ((idx)<<19) | ((ofs)<<23)) | ||
29 | #define HDA_COMPOSE_AMP_VAL(nid,chs,idx,dir) \ | 31 | #define HDA_COMPOSE_AMP_VAL(nid,chs,idx,dir) \ |
30 | ((nid) | ((chs)<<16) | ((dir)<<18) | ((idx)<<19)) | 32 | HDA_COMPOSE_AMP_VAL_OFS(nid, chs, idx, dir, 0) |
31 | /* mono volume with index (index=0,1,...) (channel=1,2) */ | 33 | /* mono volume with index (index=0,1,...) (channel=1,2) */ |
32 | #define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ | 34 | #define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ |
33 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ | 35 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ |
@@ -96,7 +98,7 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | |||
96 | const char *name); | 98 | const char *name); |
97 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | 99 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
98 | unsigned int *tlv, const char **slaves); | 100 | unsigned int *tlv, const char **slaves); |
99 | void snd_hda_codec_reset(struct hda_codec *codec); | 101 | int snd_hda_codec_reset(struct hda_codec *codec); |
100 | int snd_hda_codec_configure(struct hda_codec *codec); | 102 | int snd_hda_codec_configure(struct hda_codec *codec); |
101 | 103 | ||
102 | /* amp value bits */ | 104 | /* amp value bits */ |
@@ -134,7 +136,7 @@ extern struct hda_ctl_ops snd_hda_bind_sw; /* for bind-switch */ | |||
134 | 136 | ||
135 | struct hda_bind_ctls { | 137 | struct hda_bind_ctls { |
136 | struct hda_ctl_ops *ops; | 138 | struct hda_ctl_ops *ops; |
137 | long values[]; | 139 | unsigned long values[]; |
138 | }; | 140 | }; |
139 | 141 | ||
140 | int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, | 142 | int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, |
@@ -227,6 +229,7 @@ struct hda_multi_out { | |||
227 | hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ | 229 | hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ |
228 | hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ | 230 | hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ |
229 | hda_nid_t dig_out_nid; /* digital out audio widget */ | 231 | hda_nid_t dig_out_nid; /* digital out audio widget */ |
232 | hda_nid_t *slave_dig_outs; | ||
230 | int max_channels; /* currently supported analog channels */ | 233 | int max_channels; /* currently supported analog channels */ |
231 | int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ | 234 | int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ |
232 | int no_share_stream; /* don't share a stream with multiple pins */ | 235 | int no_share_stream; /* don't share a stream with multiple pins */ |
@@ -251,6 +254,8 @@ int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, | |||
251 | unsigned int stream_tag, | 254 | unsigned int stream_tag, |
252 | unsigned int format, | 255 | unsigned int format, |
253 | struct snd_pcm_substream *substream); | 256 | struct snd_pcm_substream *substream); |
257 | int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, | ||
258 | struct hda_multi_out *mout); | ||
254 | int snd_hda_multi_out_analog_open(struct hda_codec *codec, | 259 | int snd_hda_multi_out_analog_open(struct hda_codec *codec, |
255 | struct hda_multi_out *mout, | 260 | struct hda_multi_out *mout, |
256 | struct snd_pcm_substream *substream, | 261 | struct snd_pcm_substream *substream, |
@@ -296,6 +301,9 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen); | |||
296 | int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, | 301 | int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, |
297 | const char **modelnames, | 302 | const char **modelnames, |
298 | const struct snd_pci_quirk *pci_list); | 303 | const struct snd_pci_quirk *pci_list); |
304 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, | ||
305 | int num_configs, const char **models, | ||
306 | const struct snd_pci_quirk *tbl); | ||
299 | int snd_hda_add_new_ctls(struct hda_codec *codec, | 307 | int snd_hda_add_new_ctls(struct hda_codec *codec, |
300 | struct snd_kcontrol_new *knew); | 308 | struct snd_kcontrol_new *knew); |
301 | 309 | ||
@@ -349,9 +357,12 @@ struct auto_pin_cfg { | |||
349 | int line_out_type; /* AUTO_PIN_XXX_OUT */ | 357 | int line_out_type; /* AUTO_PIN_XXX_OUT */ |
350 | hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; | 358 | hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; |
351 | hda_nid_t input_pins[AUTO_PIN_LAST]; | 359 | hda_nid_t input_pins[AUTO_PIN_LAST]; |
352 | hda_nid_t dig_out_pin; | 360 | int dig_outs; |
361 | hda_nid_t dig_out_pins[2]; | ||
353 | hda_nid_t dig_in_pin; | 362 | hda_nid_t dig_in_pin; |
354 | hda_nid_t mono_out_pin; | 363 | hda_nid_t mono_out_pin; |
364 | int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */ | ||
365 | int dig_in_type; /* HDA_PCM_TYPE_XXX */ | ||
355 | }; | 366 | }; |
356 | 367 | ||
357 | #define get_defcfg_connect(cfg) \ | 368 | #define get_defcfg_connect(cfg) \ |
@@ -400,6 +411,7 @@ static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) | |||
400 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction); | 411 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction); |
401 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, | 412 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, |
402 | unsigned int caps); | 413 | unsigned int caps); |
414 | u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid); | ||
403 | 415 | ||
404 | int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl); | 416 | int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl); |
405 | void snd_hda_ctls_clear(struct hda_codec *codec); | 417 | void snd_hda_ctls_clear(struct hda_codec *codec); |
@@ -422,6 +434,23 @@ static inline int snd_hda_hwdep_add_sysfs(struct hda_codec *codec) | |||
422 | } | 434 | } |
423 | #endif | 435 | #endif |
424 | 436 | ||
437 | #ifdef CONFIG_SND_HDA_RECONFIG | ||
438 | const char *snd_hda_get_hint(struct hda_codec *codec, const char *key); | ||
439 | int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key); | ||
440 | #else | ||
441 | static inline | ||
442 | const char *snd_hda_get_hint(struct hda_codec *codec, const char *key) | ||
443 | { | ||
444 | return NULL; | ||
445 | } | ||
446 | |||
447 | static inline | ||
448 | int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key) | ||
449 | { | ||
450 | return -ENOENT; | ||
451 | } | ||
452 | #endif | ||
453 | |||
425 | /* | 454 | /* |
426 | * power-management | 455 | * power-management |
427 | */ | 456 | */ |
@@ -453,6 +482,7 @@ int snd_hda_check_amp_list_power(struct hda_codec *codec, | |||
453 | #define get_amp_channels(kc) (((kc)->private_value >> 16) & 0x3) | 482 | #define get_amp_channels(kc) (((kc)->private_value >> 16) & 0x3) |
454 | #define get_amp_direction(kc) (((kc)->private_value >> 18) & 0x1) | 483 | #define get_amp_direction(kc) (((kc)->private_value >> 18) & 0x1) |
455 | #define get_amp_index(kc) (((kc)->private_value >> 19) & 0xf) | 484 | #define get_amp_index(kc) (((kc)->private_value >> 19) & 0xf) |
485 | #define get_amp_offset(kc) (((kc)->private_value >> 23) & 0x3f) | ||
456 | 486 | ||
457 | /* | 487 | /* |
458 | * CEA Short Audio Descriptor data | 488 | * CEA Short Audio Descriptor data |
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index 7ca66d654148..93d7499350c6 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c | |||
@@ -399,7 +399,10 @@ static void print_conn_list(struct snd_info_buffer *buffer, | |||
399 | { | 399 | { |
400 | int c, curr = -1; | 400 | int c, curr = -1; |
401 | 401 | ||
402 | if (conn_len > 1 && wid_type != AC_WID_AUD_MIX) | 402 | if (conn_len > 1 && |
403 | wid_type != AC_WID_AUD_MIX && | ||
404 | wid_type != AC_WID_VOL_KNB && | ||
405 | wid_type != AC_WID_POWER) | ||
403 | curr = snd_hda_codec_read(codec, nid, 0, | 406 | curr = snd_hda_codec_read(codec, nid, 0, |
404 | AC_VERB_GET_CONNECT_SEL, 0); | 407 | AC_VERB_GET_CONNECT_SEL, 0); |
405 | snd_iprintf(buffer, " Connection: %d\n", conn_len); | 408 | snd_iprintf(buffer, " Connection: %d\n", conn_len); |
@@ -466,8 +469,9 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
466 | snd_iprintf(buffer, "Codec: %s\n", | 469 | snd_iprintf(buffer, "Codec: %s\n", |
467 | codec->name ? codec->name : "Not Set"); | 470 | codec->name ? codec->name : "Not Set"); |
468 | snd_iprintf(buffer, "Address: %d\n", codec->addr); | 471 | snd_iprintf(buffer, "Address: %d\n", codec->addr); |
469 | snd_iprintf(buffer, "Vendor Id: 0x%x\n", codec->vendor_id); | 472 | snd_iprintf(buffer, "Function Id: 0x%x\n", codec->function_id); |
470 | snd_iprintf(buffer, "Subsystem Id: 0x%x\n", codec->subsystem_id); | 473 | snd_iprintf(buffer, "Vendor Id: 0x%08x\n", codec->vendor_id); |
474 | snd_iprintf(buffer, "Subsystem Id: 0x%08x\n", codec->subsystem_id); | ||
471 | snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id); | 475 | snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id); |
472 | 476 | ||
473 | if (codec->mfg) | 477 | if (codec->mfg) |
@@ -553,8 +557,14 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
553 | snd_iprintf(buffer, " Amp-Out caps: "); | 557 | snd_iprintf(buffer, " Amp-Out caps: "); |
554 | print_amp_caps(buffer, codec, nid, HDA_OUTPUT); | 558 | print_amp_caps(buffer, codec, nid, HDA_OUTPUT); |
555 | snd_iprintf(buffer, " Amp-Out vals: "); | 559 | snd_iprintf(buffer, " Amp-Out vals: "); |
556 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | 560 | if (wid_type == AC_WID_PIN && |
557 | wid_caps & AC_WCAP_STEREO, 1); | 561 | codec->pin_amp_workaround) |
562 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | ||
563 | wid_caps & AC_WCAP_STEREO, | ||
564 | conn_len); | ||
565 | else | ||
566 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | ||
567 | wid_caps & AC_WCAP_STEREO, 1); | ||
558 | } | 568 | } |
559 | 569 | ||
560 | switch (wid_type) { | 570 | switch (wid_type) { |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 2e7371ec2e23..84cc49ca9148 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -27,11 +27,12 @@ | |||
27 | #include <sound/core.h> | 27 | #include <sound/core.h> |
28 | #include "hda_codec.h" | 28 | #include "hda_codec.h" |
29 | #include "hda_local.h" | 29 | #include "hda_local.h" |
30 | #include "hda_beep.h" | ||
30 | 31 | ||
31 | struct ad198x_spec { | 32 | struct ad198x_spec { |
32 | struct snd_kcontrol_new *mixers[5]; | 33 | struct snd_kcontrol_new *mixers[5]; |
33 | int num_mixers; | 34 | int num_mixers; |
34 | 35 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ | |
35 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 36 | const struct hda_verb *init_verbs[5]; /* initialization verbs |
36 | * don't forget NULL termination! | 37 | * don't forget NULL termination! |
37 | */ | 38 | */ |
@@ -154,6 +155,16 @@ static const char *ad_slave_sws[] = { | |||
154 | 155 | ||
155 | static void ad198x_free_kctls(struct hda_codec *codec); | 156 | static void ad198x_free_kctls(struct hda_codec *codec); |
156 | 157 | ||
158 | /* additional beep mixers; the actual parameters are overwritten at build */ | ||
159 | static struct snd_kcontrol_new ad_beep_mixer[] = { | ||
160 | HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT), | ||
161 | HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_OUTPUT), | ||
162 | { } /* end */ | ||
163 | }; | ||
164 | |||
165 | #define set_beep_amp(spec, nid, idx, dir) \ | ||
166 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) /* mono */ | ||
167 | |||
157 | static int ad198x_build_controls(struct hda_codec *codec) | 168 | static int ad198x_build_controls(struct hda_codec *codec) |
158 | { | 169 | { |
159 | struct ad198x_spec *spec = codec->spec; | 170 | struct ad198x_spec *spec = codec->spec; |
@@ -181,6 +192,21 @@ static int ad198x_build_controls(struct hda_codec *codec) | |||
181 | return err; | 192 | return err; |
182 | } | 193 | } |
183 | 194 | ||
195 | /* create beep controls if needed */ | ||
196 | if (spec->beep_amp) { | ||
197 | struct snd_kcontrol_new *knew; | ||
198 | for (knew = ad_beep_mixer; knew->name; knew++) { | ||
199 | struct snd_kcontrol *kctl; | ||
200 | kctl = snd_ctl_new1(knew, codec); | ||
201 | if (!kctl) | ||
202 | return -ENOMEM; | ||
203 | kctl->private_value = spec->beep_amp; | ||
204 | err = snd_hda_ctl_add(codec, kctl); | ||
205 | if (err < 0) | ||
206 | return err; | ||
207 | } | ||
208 | } | ||
209 | |||
184 | /* if we have no master control, let's create it */ | 210 | /* if we have no master control, let's create it */ |
185 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | 211 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { |
186 | unsigned int vmaster_tlv[4]; | 212 | unsigned int vmaster_tlv[4]; |
@@ -275,6 +301,14 @@ static int ad198x_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
275 | format, substream); | 301 | format, substream); |
276 | } | 302 | } |
277 | 303 | ||
304 | static int ad198x_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
305 | struct hda_codec *codec, | ||
306 | struct snd_pcm_substream *substream) | ||
307 | { | ||
308 | struct ad198x_spec *spec = codec->spec; | ||
309 | return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); | ||
310 | } | ||
311 | |||
278 | /* | 312 | /* |
279 | * Analog capture | 313 | * Analog capture |
280 | */ | 314 | */ |
@@ -333,7 +367,8 @@ static struct hda_pcm_stream ad198x_pcm_digital_playback = { | |||
333 | .ops = { | 367 | .ops = { |
334 | .open = ad198x_dig_playback_pcm_open, | 368 | .open = ad198x_dig_playback_pcm_open, |
335 | .close = ad198x_dig_playback_pcm_close, | 369 | .close = ad198x_dig_playback_pcm_close, |
336 | .prepare = ad198x_dig_playback_pcm_prepare | 370 | .prepare = ad198x_dig_playback_pcm_prepare, |
371 | .cleanup = ad198x_dig_playback_pcm_cleanup | ||
337 | }, | 372 | }, |
338 | }; | 373 | }; |
339 | 374 | ||
@@ -397,7 +432,8 @@ static void ad198x_free(struct hda_codec *codec) | |||
397 | return; | 432 | return; |
398 | 433 | ||
399 | ad198x_free_kctls(codec); | 434 | ad198x_free_kctls(codec); |
400 | kfree(codec->spec); | 435 | kfree(spec); |
436 | snd_hda_detach_beep_device(codec); | ||
401 | } | 437 | } |
402 | 438 | ||
403 | static struct hda_codec_ops ad198x_patch_ops = { | 439 | static struct hda_codec_ops ad198x_patch_ops = { |
@@ -536,8 +572,6 @@ static struct snd_kcontrol_new ad1986a_mixers[] = { | |||
536 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 572 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
537 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 573 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
538 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 574 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
539 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT), | ||
540 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
541 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 575 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
542 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), | 576 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), |
543 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 577 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
@@ -601,8 +635,7 @@ static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { | |||
601 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 635 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
602 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 636 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
603 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 637 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
604 | /* HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT), | 638 | /* |
605 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
606 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 639 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
607 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ | 640 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ |
608 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 641 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
@@ -800,8 +833,6 @@ static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = { | |||
800 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 833 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
801 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 834 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
802 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 835 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
803 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x18, 0x0, HDA_OUTPUT), | ||
804 | HDA_CODEC_MUTE("Beep Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
805 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 836 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
806 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), | 837 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), |
807 | { | 838 | { |
@@ -993,10 +1024,8 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = { | |||
993 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD), | 1024 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD), |
994 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), | 1025 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), |
995 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), | 1026 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), |
996 | SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_SAMSUNG), | ||
997 | SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_SAMSUNG), | ||
998 | SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_SAMSUNG), | ||
999 | SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA), | 1027 | SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA), |
1028 | SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG), | ||
1000 | SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK), | 1029 | SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK), |
1001 | SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP), | 1030 | SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP), |
1002 | SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK), | 1031 | SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK), |
@@ -1018,15 +1047,14 @@ static struct hda_amp_list ad1986a_loopbacks[] = { | |||
1018 | 1047 | ||
1019 | static int is_jack_available(struct hda_codec *codec, hda_nid_t nid) | 1048 | static int is_jack_available(struct hda_codec *codec, hda_nid_t nid) |
1020 | { | 1049 | { |
1021 | unsigned int conf = snd_hda_codec_read(codec, nid, 0, | 1050 | unsigned int conf = snd_hda_codec_get_pincfg(codec, nid); |
1022 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
1023 | return get_defcfg_connect(conf) != AC_JACK_PORT_NONE; | 1051 | return get_defcfg_connect(conf) != AC_JACK_PORT_NONE; |
1024 | } | 1052 | } |
1025 | 1053 | ||
1026 | static int patch_ad1986a(struct hda_codec *codec) | 1054 | static int patch_ad1986a(struct hda_codec *codec) |
1027 | { | 1055 | { |
1028 | struct ad198x_spec *spec; | 1056 | struct ad198x_spec *spec; |
1029 | int board_config; | 1057 | int err, board_config; |
1030 | 1058 | ||
1031 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1059 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1032 | if (spec == NULL) | 1060 | if (spec == NULL) |
@@ -1034,6 +1062,13 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1034 | 1062 | ||
1035 | codec->spec = spec; | 1063 | codec->spec = spec; |
1036 | 1064 | ||
1065 | err = snd_hda_attach_beep_device(codec, 0x19); | ||
1066 | if (err < 0) { | ||
1067 | ad198x_free(codec); | ||
1068 | return err; | ||
1069 | } | ||
1070 | set_beep_amp(spec, 0x18, 0, HDA_OUTPUT); | ||
1071 | |||
1037 | spec->multiout.max_channels = 6; | 1072 | spec->multiout.max_channels = 6; |
1038 | spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids); | 1073 | spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids); |
1039 | spec->multiout.dac_nids = ad1986a_dac_nids; | 1074 | spec->multiout.dac_nids = ad1986a_dac_nids; |
@@ -1213,8 +1248,6 @@ static struct snd_kcontrol_new ad1983_mixers[] = { | |||
1213 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 1248 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
1214 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 1249 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
1215 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 1250 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
1216 | HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x10, 1, 0x0, HDA_OUTPUT), | ||
1217 | HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x10, 1, 0x0, HDA_OUTPUT), | ||
1218 | HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT), | 1251 | HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT), |
1219 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1252 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1220 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1253 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
@@ -1285,6 +1318,7 @@ static struct hda_amp_list ad1983_loopbacks[] = { | |||
1285 | static int patch_ad1983(struct hda_codec *codec) | 1318 | static int patch_ad1983(struct hda_codec *codec) |
1286 | { | 1319 | { |
1287 | struct ad198x_spec *spec; | 1320 | struct ad198x_spec *spec; |
1321 | int err; | ||
1288 | 1322 | ||
1289 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1323 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1290 | if (spec == NULL) | 1324 | if (spec == NULL) |
@@ -1292,6 +1326,13 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1292 | 1326 | ||
1293 | codec->spec = spec; | 1327 | codec->spec = spec; |
1294 | 1328 | ||
1329 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
1330 | if (err < 0) { | ||
1331 | ad198x_free(codec); | ||
1332 | return err; | ||
1333 | } | ||
1334 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
1335 | |||
1295 | spec->multiout.max_channels = 2; | 1336 | spec->multiout.max_channels = 2; |
1296 | spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids); | 1337 | spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids); |
1297 | spec->multiout.dac_nids = ad1983_dac_nids; | 1338 | spec->multiout.dac_nids = ad1983_dac_nids; |
@@ -1361,8 +1402,6 @@ static struct snd_kcontrol_new ad1981_mixers[] = { | |||
1361 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), | 1402 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), |
1362 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 1403 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
1363 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), | 1404 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), |
1364 | HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT), | ||
1365 | HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x0d, 1, 0x0, HDA_OUTPUT), | ||
1366 | HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT), | 1405 | HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT), |
1367 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT), | 1406 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT), |
1368 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1407 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
@@ -1407,8 +1446,8 @@ static struct hda_verb ad1981_init_verbs[] = { | |||
1407 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1446 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, |
1408 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1447 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1409 | /* Mic boost: 0dB */ | 1448 | /* Mic boost: 0dB */ |
1410 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1449 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
1411 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1450 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
1412 | /* Record selector: Front mic */ | 1451 | /* Record selector: Front mic */ |
1413 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, | 1452 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, |
1414 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1453 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
@@ -1673,10 +1712,10 @@ static struct snd_pci_quirk ad1981_cfg_tbl[] = { | |||
1673 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), | 1712 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), |
1674 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), | 1713 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), |
1675 | /* All HP models */ | 1714 | /* All HP models */ |
1676 | SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP), | 1715 | SND_PCI_QUIRK_VENDOR(0x103c, "HP nx", AD1981_HP), |
1677 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA), | 1716 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA), |
1678 | /* Lenovo Thinkpad T60/X60/Z6xx */ | 1717 | /* Lenovo Thinkpad T60/X60/Z6xx */ |
1679 | SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1981_THINKPAD), | 1718 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1981_THINKPAD), |
1680 | /* HP nx6320 (reversed SSID, H/W bug) */ | 1719 | /* HP nx6320 (reversed SSID, H/W bug) */ |
1681 | SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP), | 1720 | SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP), |
1682 | {} | 1721 | {} |
@@ -1685,7 +1724,7 @@ static struct snd_pci_quirk ad1981_cfg_tbl[] = { | |||
1685 | static int patch_ad1981(struct hda_codec *codec) | 1724 | static int patch_ad1981(struct hda_codec *codec) |
1686 | { | 1725 | { |
1687 | struct ad198x_spec *spec; | 1726 | struct ad198x_spec *spec; |
1688 | int board_config; | 1727 | int err, board_config; |
1689 | 1728 | ||
1690 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1729 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1691 | if (spec == NULL) | 1730 | if (spec == NULL) |
@@ -1693,6 +1732,13 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1693 | 1732 | ||
1694 | codec->spec = spec; | 1733 | codec->spec = spec; |
1695 | 1734 | ||
1735 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
1736 | if (err < 0) { | ||
1737 | ad198x_free(codec); | ||
1738 | return err; | ||
1739 | } | ||
1740 | set_beep_amp(spec, 0x0d, 0, HDA_OUTPUT); | ||
1741 | |||
1696 | spec->multiout.max_channels = 2; | 1742 | spec->multiout.max_channels = 2; |
1697 | spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids); | 1743 | spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids); |
1698 | spec->multiout.dac_nids = ad1981_dac_nids; | 1744 | spec->multiout.dac_nids = ad1981_dac_nids; |
@@ -1885,8 +1931,8 @@ static hda_nid_t ad1988_capsrc_nids[3] = { | |||
1885 | #define AD1988_SPDIF_OUT_HDMI 0x0b | 1931 | #define AD1988_SPDIF_OUT_HDMI 0x0b |
1886 | #define AD1988_SPDIF_IN 0x07 | 1932 | #define AD1988_SPDIF_IN 0x07 |
1887 | 1933 | ||
1888 | static hda_nid_t ad1989b_slave_dig_outs[2] = { | 1934 | static hda_nid_t ad1989b_slave_dig_outs[] = { |
1889 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI | 1935 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0 |
1890 | }; | 1936 | }; |
1891 | 1937 | ||
1892 | static struct hda_input_mux ad1988_6stack_capture_source = { | 1938 | static struct hda_input_mux ad1988_6stack_capture_source = { |
@@ -1979,9 +2025,6 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { | |||
1979 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), | 2025 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), |
1980 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), | 2026 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), |
1981 | 2027 | ||
1982 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
1983 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
1984 | |||
1985 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2028 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
1986 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2029 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
1987 | 2030 | ||
@@ -2025,9 +2068,6 @@ static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { | |||
2025 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), | 2068 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), |
2026 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), | 2069 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), |
2027 | 2070 | ||
2028 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
2029 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
2030 | |||
2031 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2071 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2032 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2072 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2033 | 2073 | ||
@@ -2057,9 +2097,6 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { | |||
2057 | HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT), | 2097 | HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT), |
2058 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT), | 2098 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT), |
2059 | 2099 | ||
2060 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
2061 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
2062 | |||
2063 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2100 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2064 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2101 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2065 | 2102 | ||
@@ -2288,10 +2325,6 @@ static struct hda_verb ad1988_capture_init_verbs[] = { | |||
2288 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2325 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2289 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2326 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2290 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2327 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2291 | /* ADCs; muted */ | ||
2292 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2293 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2294 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2295 | 2328 | ||
2296 | { } | 2329 | { } |
2297 | }; | 2330 | }; |
@@ -2399,10 +2432,6 @@ static struct hda_verb ad1988_3stack_init_verbs[] = { | |||
2399 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2432 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2400 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2433 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2401 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2434 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2402 | /* ADCs; muted */ | ||
2403 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2404 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2405 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2406 | /* Analog Mix output amp */ | 2435 | /* Analog Mix output amp */ |
2407 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ | 2436 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ |
2408 | { } | 2437 | { } |
@@ -2474,10 +2503,6 @@ static struct hda_verb ad1988_laptop_init_verbs[] = { | |||
2474 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2503 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2475 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2504 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2476 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2505 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2477 | /* ADCs; muted */ | ||
2478 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2479 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2480 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2481 | /* Analog Mix output amp */ | 2506 | /* Analog Mix output amp */ |
2482 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ | 2507 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ |
2483 | { } | 2508 | { } |
@@ -2881,7 +2906,7 @@ static int ad1988_parse_auto_config(struct hda_codec *codec) | |||
2881 | 2906 | ||
2882 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 2907 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
2883 | 2908 | ||
2884 | if (spec->autocfg.dig_out_pin) | 2909 | if (spec->autocfg.dig_outs) |
2885 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; | 2910 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; |
2886 | if (spec->autocfg.dig_in_pin) | 2911 | if (spec->autocfg.dig_in_pin) |
2887 | spec->dig_in_nid = AD1988_SPDIF_IN; | 2912 | spec->dig_in_nid = AD1988_SPDIF_IN; |
@@ -2931,7 +2956,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = { | |||
2931 | static int patch_ad1988(struct hda_codec *codec) | 2956 | static int patch_ad1988(struct hda_codec *codec) |
2932 | { | 2957 | { |
2933 | struct ad198x_spec *spec; | 2958 | struct ad198x_spec *spec; |
2934 | int board_config; | 2959 | int err, board_config; |
2935 | 2960 | ||
2936 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 2961 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
2937 | if (spec == NULL) | 2962 | if (spec == NULL) |
@@ -2951,7 +2976,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
2951 | 2976 | ||
2952 | if (board_config == AD1988_AUTO) { | 2977 | if (board_config == AD1988_AUTO) { |
2953 | /* automatic parse from the BIOS config */ | 2978 | /* automatic parse from the BIOS config */ |
2954 | int err = ad1988_parse_auto_config(codec); | 2979 | err = ad1988_parse_auto_config(codec); |
2955 | if (err < 0) { | 2980 | if (err < 0) { |
2956 | ad198x_free(codec); | 2981 | ad198x_free(codec); |
2957 | return err; | 2982 | return err; |
@@ -2961,6 +2986,13 @@ static int patch_ad1988(struct hda_codec *codec) | |||
2961 | } | 2986 | } |
2962 | } | 2987 | } |
2963 | 2988 | ||
2989 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
2990 | if (err < 0) { | ||
2991 | ad198x_free(codec); | ||
2992 | return err; | ||
2993 | } | ||
2994 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
2995 | |||
2964 | switch (board_config) { | 2996 | switch (board_config) { |
2965 | case AD1988_6STACK: | 2997 | case AD1988_6STACK: |
2966 | case AD1988_6STACK_DIG: | 2998 | case AD1988_6STACK_DIG: |
@@ -3117,12 +3149,6 @@ static struct snd_kcontrol_new ad1884_base_mixers[] = { | |||
3117 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3149 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3118 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3150 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3119 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3151 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3120 | /* | ||
3121 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3122 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3123 | HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
3124 | HDA_CODEC_MUTE("Digital Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
3125 | */ | ||
3126 | HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), | 3152 | HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), |
3127 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3153 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3128 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3154 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3195,10 +3221,10 @@ static struct hda_verb ad1884_init_verbs[] = { | |||
3195 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 3221 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
3196 | /* Port-B (front mic) pin */ | 3222 | /* Port-B (front mic) pin */ |
3197 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3223 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3198 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3224 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3199 | /* Port-C (rear mic) pin */ | 3225 | /* Port-C (rear mic) pin */ |
3200 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3226 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3201 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3227 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3202 | /* Analog mixer; mute as default */ | 3228 | /* Analog mixer; mute as default */ |
3203 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 3229 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
3204 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 3230 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
@@ -3230,8 +3256,8 @@ static const char *ad1884_slave_vols[] = { | |||
3230 | "Mic Playback Volume", | 3256 | "Mic Playback Volume", |
3231 | "CD Playback Volume", | 3257 | "CD Playback Volume", |
3232 | "Internal Mic Playback Volume", | 3258 | "Internal Mic Playback Volume", |
3233 | "Docking Mic Playback Volume" | 3259 | "Docking Mic Playback Volume", |
3234 | "Beep Playback Volume", | 3260 | /* "Beep Playback Volume", */ |
3235 | "IEC958 Playback Volume", | 3261 | "IEC958 Playback Volume", |
3236 | NULL | 3262 | NULL |
3237 | }; | 3263 | }; |
@@ -3239,6 +3265,7 @@ static const char *ad1884_slave_vols[] = { | |||
3239 | static int patch_ad1884(struct hda_codec *codec) | 3265 | static int patch_ad1884(struct hda_codec *codec) |
3240 | { | 3266 | { |
3241 | struct ad198x_spec *spec; | 3267 | struct ad198x_spec *spec; |
3268 | int err; | ||
3242 | 3269 | ||
3243 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 3270 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
3244 | if (spec == NULL) | 3271 | if (spec == NULL) |
@@ -3246,6 +3273,13 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3246 | 3273 | ||
3247 | codec->spec = spec; | 3274 | codec->spec = spec; |
3248 | 3275 | ||
3276 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
3277 | if (err < 0) { | ||
3278 | ad198x_free(codec); | ||
3279 | return err; | ||
3280 | } | ||
3281 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
3282 | |||
3249 | spec->multiout.max_channels = 2; | 3283 | spec->multiout.max_channels = 2; |
3250 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids); | 3284 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids); |
3251 | spec->multiout.dac_nids = ad1884_dac_nids; | 3285 | spec->multiout.dac_nids = ad1884_dac_nids; |
@@ -3312,8 +3346,6 @@ static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { | |||
3312 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3346 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3313 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3347 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), |
3314 | HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3348 | HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
3315 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3316 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3317 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3349 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3318 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3350 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3319 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3351 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3349,7 +3381,7 @@ static struct hda_verb ad1984_thinkpad_init_verbs[] = { | |||
3349 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3381 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3350 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3382 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
3351 | /* docking mic boost */ | 3383 | /* docking mic boost */ |
3352 | {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3384 | {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
3353 | /* Analog mixer - docking mic; mute as default */ | 3385 | /* Analog mixer - docking mic; mute as default */ |
3354 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | 3386 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, |
3355 | /* enable EAPD bit */ | 3387 | /* enable EAPD bit */ |
@@ -3370,10 +3402,6 @@ static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { | |||
3370 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 3402 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
3371 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), | 3403 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), |
3372 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), | 3404 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), |
3373 | /* | ||
3374 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3375 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3376 | */ | ||
3377 | HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT), | 3405 | HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT), |
3378 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3406 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3379 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3407 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3459,7 +3487,7 @@ static const char *ad1984_models[AD1984_MODELS] = { | |||
3459 | 3487 | ||
3460 | static struct snd_pci_quirk ad1984_cfg_tbl[] = { | 3488 | static struct snd_pci_quirk ad1984_cfg_tbl[] = { |
3461 | /* Lenovo Thinkpad T61/X61 */ | 3489 | /* Lenovo Thinkpad T61/X61 */ |
3462 | SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1984_THINKPAD), | 3490 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
3463 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3491 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
3464 | {} | 3492 | {} |
3465 | }; | 3493 | }; |
@@ -3552,8 +3580,6 @@ static struct snd_kcontrol_new ad1884a_base_mixers[] = { | |||
3552 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3580 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3553 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3581 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3554 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3582 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3555 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3556 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3557 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3583 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3558 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT), | 3584 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT), |
3559 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3585 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
@@ -3613,10 +3639,10 @@ static struct hda_verb ad1884a_init_verbs[] = { | |||
3613 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3639 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
3614 | /* Port-B (front mic) pin */ | 3640 | /* Port-B (front mic) pin */ |
3615 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3641 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3616 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3642 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3617 | /* Port-C (rear line-in) pin */ | 3643 | /* Port-C (rear line-in) pin */ |
3618 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 3644 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
3619 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3645 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3620 | /* Port-E (rear mic) pin */ | 3646 | /* Port-E (rear mic) pin */ |
3621 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3647 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3622 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3648 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
@@ -3686,8 +3712,6 @@ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = { | |||
3686 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3712 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3687 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), | 3713 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), |
3688 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3714 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3689 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3690 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3691 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3715 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3692 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3716 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), |
3693 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3717 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
@@ -3715,8 +3739,6 @@ static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { | |||
3715 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 3739 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
3716 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), | 3740 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), |
3717 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 3741 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
3718 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3719 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3720 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), | 3742 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), |
3721 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), | 3743 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), |
3722 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3744 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3795,6 +3817,49 @@ static struct hda_verb ad1884a_laptop_verbs[] = { | |||
3795 | { } /* end */ | 3817 | { } /* end */ |
3796 | }; | 3818 | }; |
3797 | 3819 | ||
3820 | static struct hda_verb ad1884a_mobile_verbs[] = { | ||
3821 | /* DACs; unmute as default */ | ||
3822 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | ||
3823 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | ||
3824 | /* Port-A (HP) mixer - route only from analog mixer */ | ||
3825 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3826 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
3827 | /* Port-A pin */ | ||
3828 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
3829 | /* Port-A (HP) pin - always unmuted */ | ||
3830 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
3831 | /* Port-B (mic jack) pin */ | ||
3832 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
3833 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | ||
3834 | /* Port-C (int mic) pin */ | ||
3835 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
3836 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | ||
3837 | /* Port-F (int speaker) mixer - route only from analog mixer */ | ||
3838 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3839 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
3840 | /* Port-F pin */ | ||
3841 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
3842 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3843 | /* Analog mixer; mute as default */ | ||
3844 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3845 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
3846 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
3847 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
3848 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
3849 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, | ||
3850 | /* Analog Mix output amp */ | ||
3851 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3852 | /* capture sources */ | ||
3853 | /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */ | ||
3854 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3855 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
3856 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3857 | /* unsolicited event for pin-sense */ | ||
3858 | {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, | ||
3859 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, | ||
3860 | { } /* end */ | ||
3861 | }; | ||
3862 | |||
3798 | /* | 3863 | /* |
3799 | * Thinkpad X300 | 3864 | * Thinkpad X300 |
3800 | * 0x11 - HP | 3865 | * 0x11 - HP |
@@ -3827,8 +3892,6 @@ static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { | |||
3827 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 3892 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
3828 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), | 3893 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), |
3829 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 3894 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
3830 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3831 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3832 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3895 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3833 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), | 3896 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), |
3834 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3897 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3902,9 +3965,9 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | |||
3902 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), | 3965 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), |
3903 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), | 3966 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), |
3904 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), | 3967 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), |
3905 | SND_PCI_QUIRK(0x103c, 0x30e6, "HP 6730b", AD1884A_LAPTOP), | 3968 | SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE), |
3906 | SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP), | 3969 | SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP), |
3907 | SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP), | 3970 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP), |
3908 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), | 3971 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), |
3909 | {} | 3972 | {} |
3910 | }; | 3973 | }; |
@@ -3912,7 +3975,7 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | |||
3912 | static int patch_ad1884a(struct hda_codec *codec) | 3975 | static int patch_ad1884a(struct hda_codec *codec) |
3913 | { | 3976 | { |
3914 | struct ad198x_spec *spec; | 3977 | struct ad198x_spec *spec; |
3915 | int board_config; | 3978 | int err, board_config; |
3916 | 3979 | ||
3917 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 3980 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
3918 | if (spec == NULL) | 3981 | if (spec == NULL) |
@@ -3920,6 +3983,13 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
3920 | 3983 | ||
3921 | codec->spec = spec; | 3984 | codec->spec = spec; |
3922 | 3985 | ||
3986 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
3987 | if (err < 0) { | ||
3988 | ad198x_free(codec); | ||
3989 | return err; | ||
3990 | } | ||
3991 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
3992 | |||
3923 | spec->multiout.max_channels = 2; | 3993 | spec->multiout.max_channels = 2; |
3924 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884a_dac_nids); | 3994 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884a_dac_nids); |
3925 | spec->multiout.dac_nids = ad1884a_dac_nids; | 3995 | spec->multiout.dac_nids = ad1884a_dac_nids; |
@@ -3950,13 +4020,29 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
3950 | spec->input_mux = &ad1884a_laptop_capture_source; | 4020 | spec->input_mux = &ad1884a_laptop_capture_source; |
3951 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; | 4021 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; |
3952 | codec->patch_ops.init = ad1884a_hp_init; | 4022 | codec->patch_ops.init = ad1884a_hp_init; |
4023 | /* set the upper-limit for mixer amp to 0dB for avoiding the | ||
4024 | * possible damage by overloading | ||
4025 | */ | ||
4026 | snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, | ||
4027 | (0x17 << AC_AMPCAP_OFFSET_SHIFT) | | ||
4028 | (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
4029 | (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
4030 | (1 << AC_AMPCAP_MUTE_SHIFT)); | ||
3953 | break; | 4031 | break; |
3954 | case AD1884A_MOBILE: | 4032 | case AD1884A_MOBILE: |
3955 | spec->mixers[0] = ad1884a_mobile_mixers; | 4033 | spec->mixers[0] = ad1884a_mobile_mixers; |
3956 | spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; | 4034 | spec->init_verbs[0] = ad1884a_mobile_verbs; |
3957 | spec->multiout.dig_out_nid = 0; | 4035 | spec->multiout.dig_out_nid = 0; |
3958 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; | 4036 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; |
3959 | codec->patch_ops.init = ad1884a_hp_init; | 4037 | codec->patch_ops.init = ad1884a_hp_init; |
4038 | /* set the upper-limit for mixer amp to 0dB for avoiding the | ||
4039 | * possible damage by overloading | ||
4040 | */ | ||
4041 | snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, | ||
4042 | (0x17 << AC_AMPCAP_OFFSET_SHIFT) | | ||
4043 | (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
4044 | (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
4045 | (1 << AC_AMPCAP_MUTE_SHIFT)); | ||
3960 | break; | 4046 | break; |
3961 | case AD1884A_THINKPAD: | 4047 | case AD1884A_THINKPAD: |
3962 | spec->mixers[0] = ad1984a_thinkpad_mixers; | 4048 | spec->mixers[0] = ad1984a_thinkpad_mixers; |
@@ -4074,8 +4160,6 @@ static struct snd_kcontrol_new ad1882_loopback_mixers[] = { | |||
4074 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT), | 4160 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT), |
4075 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), | 4161 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), |
4076 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), | 4162 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), |
4077 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT), | ||
4078 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT), | ||
4079 | { } /* end */ | 4163 | { } /* end */ |
4080 | }; | 4164 | }; |
4081 | 4165 | ||
@@ -4088,8 +4172,6 @@ static struct snd_kcontrol_new ad1882a_loopback_mixers[] = { | |||
4088 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), | 4172 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), |
4089 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), | 4173 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), |
4090 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), | 4174 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), |
4091 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT), | ||
4092 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT), | ||
4093 | HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT), | 4175 | HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT), |
4094 | { } /* end */ | 4176 | { } /* end */ |
4095 | }; | 4177 | }; |
@@ -4248,7 +4330,7 @@ static const char *ad1882_models[AD1986A_MODELS] = { | |||
4248 | static int patch_ad1882(struct hda_codec *codec) | 4330 | static int patch_ad1882(struct hda_codec *codec) |
4249 | { | 4331 | { |
4250 | struct ad198x_spec *spec; | 4332 | struct ad198x_spec *spec; |
4251 | int board_config; | 4333 | int err, board_config; |
4252 | 4334 | ||
4253 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 4335 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
4254 | if (spec == NULL) | 4336 | if (spec == NULL) |
@@ -4256,6 +4338,13 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4256 | 4338 | ||
4257 | codec->spec = spec; | 4339 | codec->spec = spec; |
4258 | 4340 | ||
4341 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
4342 | if (err < 0) { | ||
4343 | ad198x_free(codec); | ||
4344 | return err; | ||
4345 | } | ||
4346 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
4347 | |||
4259 | spec->multiout.max_channels = 6; | 4348 | spec->multiout.max_channels = 6; |
4260 | spec->multiout.num_dacs = 3; | 4349 | spec->multiout.num_dacs = 3; |
4261 | spec->multiout.dac_nids = ad1882_dac_nids; | 4350 | spec->multiout.dac_nids = ad1882_dac_nids; |
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c index f3ebe837f2d5..c921264bbd71 100644 --- a/sound/pci/hda/patch_cmedia.c +++ b/sound/pci/hda/patch_cmedia.c | |||
@@ -680,13 +680,13 @@ static int patch_cmi9880(struct hda_codec *codec) | |||
680 | struct auto_pin_cfg cfg; | 680 | struct auto_pin_cfg cfg; |
681 | 681 | ||
682 | /* collect pin default configuration */ | 682 | /* collect pin default configuration */ |
683 | port_e = snd_hda_codec_read(codec, 0x0f, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 683 | port_e = snd_hda_codec_get_pincfg(codec, 0x0f); |
684 | port_f = snd_hda_codec_read(codec, 0x10, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 684 | port_f = snd_hda_codec_get_pincfg(codec, 0x10); |
685 | spec->front_panel = 1; | 685 | spec->front_panel = 1; |
686 | if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE || | 686 | if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE || |
687 | get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) { | 687 | get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) { |
688 | port_g = snd_hda_codec_read(codec, 0x1f, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 688 | port_g = snd_hda_codec_get_pincfg(codec, 0x1f); |
689 | port_h = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 689 | port_h = snd_hda_codec_get_pincfg(codec, 0x20); |
690 | spec->channel_modes = cmi9880_channel_modes; | 690 | spec->channel_modes = cmi9880_channel_modes; |
691 | /* no front panel */ | 691 | /* no front panel */ |
692 | if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE || | 692 | if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE || |
@@ -703,8 +703,8 @@ static int patch_cmi9880(struct hda_codec *codec) | |||
703 | spec->multiout.max_channels = cmi9880_channel_modes[0].channels; | 703 | spec->multiout.max_channels = cmi9880_channel_modes[0].channels; |
704 | } else { | 704 | } else { |
705 | spec->input_mux = &cmi9880_basic_mux; | 705 | spec->input_mux = &cmi9880_basic_mux; |
706 | port_spdifi = snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 706 | port_spdifi = snd_hda_codec_get_pincfg(codec, 0x13); |
707 | port_spdifo = snd_hda_codec_read(codec, 0x12, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 707 | port_spdifo = snd_hda_codec_get_pincfg(codec, 0x12); |
708 | if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE) | 708 | if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE) |
709 | spec->multiout.dig_out_nid = CMI_DIG_OUT_NID; | 709 | spec->multiout.dig_out_nid = CMI_DIG_OUT_NID; |
710 | if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE) | 710 | if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE) |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 75de40aaab0a..56ce19e68cb5 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -58,6 +58,7 @@ struct conexant_spec { | |||
58 | 58 | ||
59 | struct snd_kcontrol_new *mixers[5]; | 59 | struct snd_kcontrol_new *mixers[5]; |
60 | int num_mixers; | 60 | int num_mixers; |
61 | hda_nid_t vmaster_nid; | ||
61 | 62 | ||
62 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 63 | const struct hda_verb *init_verbs[5]; /* initialization verbs |
63 | * don't forget NULL | 64 | * don't forget NULL |
@@ -72,6 +73,7 @@ struct conexant_spec { | |||
72 | */ | 73 | */ |
73 | unsigned int cur_eapd; | 74 | unsigned int cur_eapd; |
74 | unsigned int hp_present; | 75 | unsigned int hp_present; |
76 | unsigned int no_auto_mic; | ||
75 | unsigned int need_dac_fix; | 77 | unsigned int need_dac_fix; |
76 | 78 | ||
77 | /* capture */ | 79 | /* capture */ |
@@ -347,12 +349,21 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol, | |||
347 | &spec->cur_mux[adc_idx]); | 349 | &spec->cur_mux[adc_idx]); |
348 | } | 350 | } |
349 | 351 | ||
352 | #ifdef CONFIG_SND_JACK | ||
353 | static void conexant_free_jack_priv(struct snd_jack *jack) | ||
354 | { | ||
355 | struct conexant_jack *jacks = jack->private_data; | ||
356 | jacks->nid = 0; | ||
357 | jacks->jack = NULL; | ||
358 | } | ||
359 | |||
350 | static int conexant_add_jack(struct hda_codec *codec, | 360 | static int conexant_add_jack(struct hda_codec *codec, |
351 | hda_nid_t nid, int type) | 361 | hda_nid_t nid, int type) |
352 | { | 362 | { |
353 | struct conexant_spec *spec; | 363 | struct conexant_spec *spec; |
354 | struct conexant_jack *jack; | 364 | struct conexant_jack *jack; |
355 | const char *name; | 365 | const char *name; |
366 | int err; | ||
356 | 367 | ||
357 | spec = codec->spec; | 368 | spec = codec->spec; |
358 | snd_array_init(&spec->jacks, sizeof(*jack), 32); | 369 | snd_array_init(&spec->jacks, sizeof(*jack), 32); |
@@ -365,7 +376,12 @@ static int conexant_add_jack(struct hda_codec *codec, | |||
365 | jack->nid = nid; | 376 | jack->nid = nid; |
366 | jack->type = type; | 377 | jack->type = type; |
367 | 378 | ||
368 | return snd_jack_new(codec->bus->card, name, type, &jack->jack); | 379 | err = snd_jack_new(codec->bus->card, name, type, &jack->jack); |
380 | if (err < 0) | ||
381 | return err; | ||
382 | jack->jack->private_data = jack; | ||
383 | jack->jack->private_free = conexant_free_jack_priv; | ||
384 | return 0; | ||
369 | } | 385 | } |
370 | 386 | ||
371 | static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) | 387 | static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) |
@@ -394,7 +410,6 @@ static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) | |||
394 | 410 | ||
395 | static int conexant_init_jacks(struct hda_codec *codec) | 411 | static int conexant_init_jacks(struct hda_codec *codec) |
396 | { | 412 | { |
397 | #ifdef CONFIG_SND_JACK | ||
398 | struct conexant_spec *spec = codec->spec; | 413 | struct conexant_spec *spec = codec->spec; |
399 | int i; | 414 | int i; |
400 | 415 | ||
@@ -422,10 +437,19 @@ static int conexant_init_jacks(struct hda_codec *codec) | |||
422 | ++hv; | 437 | ++hv; |
423 | } | 438 | } |
424 | } | 439 | } |
425 | #endif | ||
426 | return 0; | 440 | return 0; |
427 | 441 | ||
428 | } | 442 | } |
443 | #else | ||
444 | static inline void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) | ||
445 | { | ||
446 | } | ||
447 | |||
448 | static inline int conexant_init_jacks(struct hda_codec *codec) | ||
449 | { | ||
450 | return 0; | ||
451 | } | ||
452 | #endif | ||
429 | 453 | ||
430 | static int conexant_init(struct hda_codec *codec) | 454 | static int conexant_init(struct hda_codec *codec) |
431 | { | 455 | { |
@@ -444,14 +468,39 @@ static void conexant_free(struct hda_codec *codec) | |||
444 | if (spec->jacks.list) { | 468 | if (spec->jacks.list) { |
445 | struct conexant_jack *jacks = spec->jacks.list; | 469 | struct conexant_jack *jacks = spec->jacks.list; |
446 | int i; | 470 | int i; |
447 | for (i = 0; i < spec->jacks.used; i++) | 471 | for (i = 0; i < spec->jacks.used; i++, jacks++) { |
448 | snd_device_free(codec->bus->card, &jacks[i].jack); | 472 | if (jacks->jack) |
473 | snd_device_free(codec->bus->card, jacks->jack); | ||
474 | } | ||
449 | snd_array_free(&spec->jacks); | 475 | snd_array_free(&spec->jacks); |
450 | } | 476 | } |
451 | #endif | 477 | #endif |
452 | kfree(codec->spec); | 478 | kfree(codec->spec); |
453 | } | 479 | } |
454 | 480 | ||
481 | static struct snd_kcontrol_new cxt_capture_mixers[] = { | ||
482 | { | ||
483 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
484 | .name = "Capture Source", | ||
485 | .info = conexant_mux_enum_info, | ||
486 | .get = conexant_mux_enum_get, | ||
487 | .put = conexant_mux_enum_put | ||
488 | }, | ||
489 | {} | ||
490 | }; | ||
491 | |||
492 | static const char *slave_vols[] = { | ||
493 | "Headphone Playback Volume", | ||
494 | "Speaker Playback Volume", | ||
495 | NULL | ||
496 | }; | ||
497 | |||
498 | static const char *slave_sws[] = { | ||
499 | "Headphone Playback Switch", | ||
500 | "Speaker Playback Switch", | ||
501 | NULL | ||
502 | }; | ||
503 | |||
455 | static int conexant_build_controls(struct hda_codec *codec) | 504 | static int conexant_build_controls(struct hda_codec *codec) |
456 | { | 505 | { |
457 | struct conexant_spec *spec = codec->spec; | 506 | struct conexant_spec *spec = codec->spec; |
@@ -479,6 +528,32 @@ static int conexant_build_controls(struct hda_codec *codec) | |||
479 | if (err < 0) | 528 | if (err < 0) |
480 | return err; | 529 | return err; |
481 | } | 530 | } |
531 | |||
532 | /* if we have no master control, let's create it */ | ||
533 | if (spec->vmaster_nid && | ||
534 | !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | ||
535 | unsigned int vmaster_tlv[4]; | ||
536 | snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, | ||
537 | HDA_OUTPUT, vmaster_tlv); | ||
538 | err = snd_hda_add_vmaster(codec, "Master Playback Volume", | ||
539 | vmaster_tlv, slave_vols); | ||
540 | if (err < 0) | ||
541 | return err; | ||
542 | } | ||
543 | if (spec->vmaster_nid && | ||
544 | !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { | ||
545 | err = snd_hda_add_vmaster(codec, "Master Playback Switch", | ||
546 | NULL, slave_sws); | ||
547 | if (err < 0) | ||
548 | return err; | ||
549 | } | ||
550 | |||
551 | if (spec->input_mux) { | ||
552 | err = snd_hda_add_new_ctls(codec, cxt_capture_mixers); | ||
553 | if (err < 0) | ||
554 | return err; | ||
555 | } | ||
556 | |||
482 | return 0; | 557 | return 0; |
483 | } | 558 | } |
484 | 559 | ||
@@ -710,13 +785,6 @@ static void cxt5045_hp_unsol_event(struct hda_codec *codec, | |||
710 | } | 785 | } |
711 | 786 | ||
712 | static struct snd_kcontrol_new cxt5045_mixers[] = { | 787 | static struct snd_kcontrol_new cxt5045_mixers[] = { |
713 | { | ||
714 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
715 | .name = "Capture Source", | ||
716 | .info = conexant_mux_enum_info, | ||
717 | .get = conexant_mux_enum_get, | ||
718 | .put = conexant_mux_enum_put | ||
719 | }, | ||
720 | HDA_CODEC_VOLUME("Int Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), | 788 | HDA_CODEC_VOLUME("Int Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), |
721 | HDA_CODEC_MUTE("Int Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), | 789 | HDA_CODEC_MUTE("Int Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), |
722 | HDA_CODEC_VOLUME("Ext Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), | 790 | HDA_CODEC_VOLUME("Ext Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), |
@@ -750,13 +818,6 @@ static struct snd_kcontrol_new cxt5045_benq_mixers[] = { | |||
750 | }; | 818 | }; |
751 | 819 | ||
752 | static struct snd_kcontrol_new cxt5045_mixers_hp530[] = { | 820 | static struct snd_kcontrol_new cxt5045_mixers_hp530[] = { |
753 | { | ||
754 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
755 | .name = "Capture Source", | ||
756 | .info = conexant_mux_enum_info, | ||
757 | .get = conexant_mux_enum_get, | ||
758 | .put = conexant_mux_enum_put | ||
759 | }, | ||
760 | HDA_CODEC_VOLUME("Int Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), | 821 | HDA_CODEC_VOLUME("Int Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), |
761 | HDA_CODEC_MUTE("Int Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), | 822 | HDA_CODEC_MUTE("Int Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), |
762 | HDA_CODEC_VOLUME("Ext Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), | 823 | HDA_CODEC_VOLUME("Ext Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), |
@@ -993,15 +1054,9 @@ static const char *cxt5045_models[CXT5045_MODELS] = { | |||
993 | }; | 1054 | }; |
994 | 1055 | ||
995 | static struct snd_pci_quirk cxt5045_cfg_tbl[] = { | 1056 | static struct snd_pci_quirk cxt5045_cfg_tbl[] = { |
996 | SND_PCI_QUIRK(0x103c, 0x30a5, "HP", CXT5045_LAPTOP_HPSENSE), | ||
997 | SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV Series", CXT5045_LAPTOP_HPSENSE), | ||
998 | SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2120", CXT5045_LAPTOP_HPSENSE), | ||
999 | SND_PCI_QUIRK(0x103c, 0x30b7, "HP DV6000Z", CXT5045_LAPTOP_HPSENSE), | ||
1000 | SND_PCI_QUIRK(0x103c, 0x30bb, "HP DV8000", CXT5045_LAPTOP_HPSENSE), | ||
1001 | SND_PCI_QUIRK(0x103c, 0x30cd, "HP DV Series", CXT5045_LAPTOP_HPSENSE), | ||
1002 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV9533EG", CXT5045_LAPTOP_HPSENSE), | ||
1003 | SND_PCI_QUIRK(0x103c, 0x30d5, "HP 530", CXT5045_LAPTOP_HP530), | 1057 | SND_PCI_QUIRK(0x103c, 0x30d5, "HP 530", CXT5045_LAPTOP_HP530), |
1004 | SND_PCI_QUIRK(0x103c, 0x30d9, "HP Spartan", CXT5045_LAPTOP_HPSENSE), | 1058 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP DV Series", |
1059 | CXT5045_LAPTOP_HPSENSE), | ||
1005 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P105", CXT5045_LAPTOP_MICSENSE), | 1060 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P105", CXT5045_LAPTOP_MICSENSE), |
1006 | SND_PCI_QUIRK(0x152d, 0x0753, "Benq R55E", CXT5045_BENQ), | 1061 | SND_PCI_QUIRK(0x152d, 0x0753, "Benq R55E", CXT5045_BENQ), |
1007 | SND_PCI_QUIRK(0x1734, 0x10ad, "Fujitsu Si1520", CXT5045_LAPTOP_MICSENSE), | 1062 | SND_PCI_QUIRK(0x1734, 0x10ad, "Fujitsu Si1520", CXT5045_LAPTOP_MICSENSE), |
@@ -1011,8 +1066,8 @@ static struct snd_pci_quirk cxt5045_cfg_tbl[] = { | |||
1011 | SND_PCI_QUIRK(0x1509, 0x1e40, "FIC", CXT5045_LAPTOP_HPMICSENSE), | 1066 | SND_PCI_QUIRK(0x1509, 0x1e40, "FIC", CXT5045_LAPTOP_HPMICSENSE), |
1012 | SND_PCI_QUIRK(0x1509, 0x2f05, "FIC", CXT5045_LAPTOP_HPMICSENSE), | 1067 | SND_PCI_QUIRK(0x1509, 0x2f05, "FIC", CXT5045_LAPTOP_HPMICSENSE), |
1013 | SND_PCI_QUIRK(0x1509, 0x2f06, "FIC", CXT5045_LAPTOP_HPMICSENSE), | 1068 | SND_PCI_QUIRK(0x1509, 0x2f06, "FIC", CXT5045_LAPTOP_HPMICSENSE), |
1014 | SND_PCI_QUIRK(0x1631, 0xc106, "Packard Bell", CXT5045_LAPTOP_HPMICSENSE), | 1069 | SND_PCI_QUIRK_MASK(0x1631, 0xff00, 0xc100, "Packard Bell", |
1015 | SND_PCI_QUIRK(0x1631, 0xc107, "Packard Bell", CXT5045_LAPTOP_HPMICSENSE), | 1070 | CXT5045_LAPTOP_HPMICSENSE), |
1016 | SND_PCI_QUIRK(0x8086, 0x2111, "Conexant Reference board", CXT5045_LAPTOP_HPSENSE), | 1071 | SND_PCI_QUIRK(0x8086, 0x2111, "Conexant Reference board", CXT5045_LAPTOP_HPSENSE), |
1017 | {} | 1072 | {} |
1018 | }; | 1073 | }; |
@@ -1026,6 +1081,7 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
1026 | if (!spec) | 1081 | if (!spec) |
1027 | return -ENOMEM; | 1082 | return -ENOMEM; |
1028 | codec->spec = spec; | 1083 | codec->spec = spec; |
1084 | codec->pin_amp_workaround = 1; | ||
1029 | 1085 | ||
1030 | spec->multiout.max_channels = 2; | 1086 | spec->multiout.max_channels = 2; |
1031 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); | 1087 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); |
@@ -1125,7 +1181,7 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
1125 | /* Conexant 5047 specific */ | 1181 | /* Conexant 5047 specific */ |
1126 | #define CXT5047_SPDIF_OUT 0x11 | 1182 | #define CXT5047_SPDIF_OUT 0x11 |
1127 | 1183 | ||
1128 | static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c }; | 1184 | static hda_nid_t cxt5047_dac_nids[1] = { 0x10 }; /* 0x1c */ |
1129 | static hda_nid_t cxt5047_adc_nids[1] = { 0x12 }; | 1185 | static hda_nid_t cxt5047_adc_nids[1] = { 0x12 }; |
1130 | static hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a }; | 1186 | static hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a }; |
1131 | 1187 | ||
@@ -1133,20 +1189,6 @@ static struct hda_channel_mode cxt5047_modes[1] = { | |||
1133 | { 2, NULL }, | 1189 | { 2, NULL }, |
1134 | }; | 1190 | }; |
1135 | 1191 | ||
1136 | static struct hda_input_mux cxt5047_capture_source = { | ||
1137 | .num_items = 1, | ||
1138 | .items = { | ||
1139 | { "Mic", 0x2 }, | ||
1140 | } | ||
1141 | }; | ||
1142 | |||
1143 | static struct hda_input_mux cxt5047_hp_capture_source = { | ||
1144 | .num_items = 1, | ||
1145 | .items = { | ||
1146 | { "ExtMic", 0x2 }, | ||
1147 | } | ||
1148 | }; | ||
1149 | |||
1150 | static struct hda_input_mux cxt5047_toshiba_capture_source = { | 1192 | static struct hda_input_mux cxt5047_toshiba_capture_source = { |
1151 | .num_items = 2, | 1193 | .num_items = 2, |
1152 | .items = { | 1194 | .items = { |
@@ -1170,7 +1212,11 @@ static int cxt5047_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
1170 | * the headphone jack | 1212 | * the headphone jack |
1171 | */ | 1213 | */ |
1172 | bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE; | 1214 | bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE; |
1173 | snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, | 1215 | /* NOTE: Conexat codec needs the index for *OUTPUT* amp of |
1216 | * pin widgets unlike other codecs. In this case, we need to | ||
1217 | * set index 0x01 for the volume from the mixer amp 0x19. | ||
1218 | */ | ||
1219 | snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, | ||
1174 | HDA_AMP_MUTE, bits); | 1220 | HDA_AMP_MUTE, bits); |
1175 | bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE; | 1221 | bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE; |
1176 | snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0, | 1222 | snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0, |
@@ -1178,16 +1224,6 @@ static int cxt5047_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
1178 | return 1; | 1224 | return 1; |
1179 | } | 1225 | } |
1180 | 1226 | ||
1181 | /* bind volumes of both NID 0x13 (Headphones) and 0x1d (Speakers) */ | ||
1182 | static struct hda_bind_ctls cxt5047_bind_master_vol = { | ||
1183 | .ops = &snd_hda_bind_vol, | ||
1184 | .values = { | ||
1185 | HDA_COMPOSE_AMP_VAL(0x13, 3, 0, HDA_OUTPUT), | ||
1186 | HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), | ||
1187 | 0 | ||
1188 | }, | ||
1189 | }; | ||
1190 | |||
1191 | /* mute internal speaker if HP is plugged */ | 1227 | /* mute internal speaker if HP is plugged */ |
1192 | static void cxt5047_hp_automute(struct hda_codec *codec) | 1228 | static void cxt5047_hp_automute(struct hda_codec *codec) |
1193 | { | 1229 | { |
@@ -1198,27 +1234,8 @@ static void cxt5047_hp_automute(struct hda_codec *codec) | |||
1198 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 1234 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
1199 | 1235 | ||
1200 | bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; | 1236 | bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; |
1201 | snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, | 1237 | /* See the note in cxt5047_hp_master_sw_put */ |
1202 | HDA_AMP_MUTE, bits); | 1238 | snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, |
1203 | /* Mute/Unmute PCM 2 for good measure - some systems need this */ | ||
1204 | snd_hda_codec_amp_stereo(codec, 0x1c, HDA_OUTPUT, 0, | ||
1205 | HDA_AMP_MUTE, bits); | ||
1206 | } | ||
1207 | |||
1208 | /* mute internal speaker if HP is plugged */ | ||
1209 | static void cxt5047_hp2_automute(struct hda_codec *codec) | ||
1210 | { | ||
1211 | struct conexant_spec *spec = codec->spec; | ||
1212 | unsigned int bits; | ||
1213 | |||
1214 | spec->hp_present = snd_hda_codec_read(codec, 0x13, 0, | ||
1215 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
1216 | |||
1217 | bits = spec->hp_present ? HDA_AMP_MUTE : 0; | ||
1218 | snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, | ||
1219 | HDA_AMP_MUTE, bits); | ||
1220 | /* Mute/Unmute PCM 2 for good measure - some systems need this */ | ||
1221 | snd_hda_codec_amp_stereo(codec, 0x1c, HDA_OUTPUT, 0, | ||
1222 | HDA_AMP_MUTE, bits); | 1239 | HDA_AMP_MUTE, bits); |
1223 | } | 1240 | } |
1224 | 1241 | ||
@@ -1259,55 +1276,14 @@ static void cxt5047_hp_unsol_event(struct hda_codec *codec, | |||
1259 | } | 1276 | } |
1260 | } | 1277 | } |
1261 | 1278 | ||
1262 | /* unsolicited event for HP jack sensing - non-EAPD systems */ | 1279 | static struct snd_kcontrol_new cxt5047_base_mixers[] = { |
1263 | static void cxt5047_hp2_unsol_event(struct hda_codec *codec, | 1280 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x19, 0x02, HDA_INPUT), |
1264 | unsigned int res) | 1281 | HDA_CODEC_MUTE("Mic Playback Switch", 0x19, 0x02, HDA_INPUT), |
1265 | { | 1282 | HDA_CODEC_VOLUME("Mic Boost", 0x1a, 0x0, HDA_OUTPUT), |
1266 | res >>= 26; | ||
1267 | switch (res) { | ||
1268 | case CONEXANT_HP_EVENT: | ||
1269 | cxt5047_hp2_automute(codec); | ||
1270 | break; | ||
1271 | case CONEXANT_MIC_EVENT: | ||
1272 | cxt5047_hp_automic(codec); | ||
1273 | break; | ||
1274 | } | ||
1275 | } | ||
1276 | |||
1277 | static struct snd_kcontrol_new cxt5047_mixers[] = { | ||
1278 | HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT), | ||
1279 | HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT), | ||
1280 | HDA_CODEC_VOLUME("Mic Gain Volume", 0x1a, 0x0, HDA_OUTPUT), | ||
1281 | HDA_CODEC_MUTE("Mic Gain Switch", 0x1a, 0x0, HDA_OUTPUT), | ||
1282 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT), | 1283 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT), |
1283 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), | 1284 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), |
1284 | HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), | 1285 | HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), |
1285 | HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT), | 1286 | HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT), |
1286 | HDA_CODEC_VOLUME("PCM-2 Volume", 0x1c, 0x00, HDA_OUTPUT), | ||
1287 | HDA_CODEC_MUTE("PCM-2 Switch", 0x1c, 0x00, HDA_OUTPUT), | ||
1288 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x00, HDA_OUTPUT), | ||
1289 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x1d, 0x00, HDA_OUTPUT), | ||
1290 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), | ||
1291 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x13, 0x00, HDA_OUTPUT), | ||
1292 | |||
1293 | {} | ||
1294 | }; | ||
1295 | |||
1296 | static struct snd_kcontrol_new cxt5047_toshiba_mixers[] = { | ||
1297 | { | ||
1298 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1299 | .name = "Capture Source", | ||
1300 | .info = conexant_mux_enum_info, | ||
1301 | .get = conexant_mux_enum_get, | ||
1302 | .put = conexant_mux_enum_put | ||
1303 | }, | ||
1304 | HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT), | ||
1305 | HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT), | ||
1306 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT), | ||
1307 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), | ||
1308 | HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), | ||
1309 | HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT), | ||
1310 | HDA_BIND_VOL("Master Playback Volume", &cxt5047_bind_master_vol), | ||
1311 | { | 1287 | { |
1312 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1288 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
1313 | .name = "Master Playback Switch", | 1289 | .name = "Master Playback Switch", |
@@ -1320,29 +1296,15 @@ static struct snd_kcontrol_new cxt5047_toshiba_mixers[] = { | |||
1320 | {} | 1296 | {} |
1321 | }; | 1297 | }; |
1322 | 1298 | ||
1323 | static struct snd_kcontrol_new cxt5047_hp_mixers[] = { | 1299 | static struct snd_kcontrol_new cxt5047_hp_spk_mixers[] = { |
1324 | { | 1300 | /* See the note in cxt5047_hp_master_sw_put */ |
1325 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1301 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x01, HDA_OUTPUT), |
1326 | .name = "Capture Source", | 1302 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), |
1327 | .info = conexant_mux_enum_info, | 1303 | {} |
1328 | .get = conexant_mux_enum_get, | 1304 | }; |
1329 | .put = conexant_mux_enum_put | 1305 | |
1330 | }, | 1306 | static struct snd_kcontrol_new cxt5047_hp_only_mixers[] = { |
1331 | HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT), | ||
1332 | HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19,0x02,HDA_INPUT), | ||
1333 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT), | ||
1334 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), | ||
1335 | HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), | ||
1336 | HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT), | ||
1337 | HDA_CODEC_VOLUME("Master Playback Volume", 0x13, 0x00, HDA_OUTPUT), | 1307 | HDA_CODEC_VOLUME("Master Playback Volume", 0x13, 0x00, HDA_OUTPUT), |
1338 | { | ||
1339 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1340 | .name = "Master Playback Switch", | ||
1341 | .info = cxt_eapd_info, | ||
1342 | .get = cxt_eapd_get, | ||
1343 | .put = cxt5047_hp_master_sw_put, | ||
1344 | .private_value = 0x13, | ||
1345 | }, | ||
1346 | { } /* end */ | 1308 | { } /* end */ |
1347 | }; | 1309 | }; |
1348 | 1310 | ||
@@ -1353,8 +1315,8 @@ static struct hda_verb cxt5047_init_verbs[] = { | |||
1353 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 }, | 1315 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 }, |
1354 | /* HP, Speaker */ | 1316 | /* HP, Speaker */ |
1355 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, | 1317 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, |
1356 | {0x13, AC_VERB_SET_CONNECT_SEL,0x1}, | 1318 | {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */ |
1357 | {0x1d, AC_VERB_SET_CONNECT_SEL,0x0}, | 1319 | {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mixer(0x19) */ |
1358 | /* Record selector: Mic */ | 1320 | /* Record selector: Mic */ |
1359 | {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, | 1321 | {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, |
1360 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, | 1322 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, |
@@ -1374,30 +1336,7 @@ static struct hda_verb cxt5047_init_verbs[] = { | |||
1374 | 1336 | ||
1375 | /* configuration for Toshiba Laptops */ | 1337 | /* configuration for Toshiba Laptops */ |
1376 | static struct hda_verb cxt5047_toshiba_init_verbs[] = { | 1338 | static struct hda_verb cxt5047_toshiba_init_verbs[] = { |
1377 | {0x13, AC_VERB_SET_EAPD_BTLENABLE, 0x0 }, /* default on */ | 1339 | {0x13, AC_VERB_SET_EAPD_BTLENABLE, 0x0}, /* default off */ |
1378 | /* pin sensing on HP and Mic jacks */ | ||
1379 | {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | ||
1380 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, | ||
1381 | /* Speaker routing */ | ||
1382 | {0x1d, AC_VERB_SET_CONNECT_SEL,0x1}, | ||
1383 | {} | ||
1384 | }; | ||
1385 | |||
1386 | /* configuration for HP Laptops */ | ||
1387 | static struct hda_verb cxt5047_hp_init_verbs[] = { | ||
1388 | /* pin sensing on HP jack */ | ||
1389 | {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | ||
1390 | /* 0x13 is actually shared by both HP and speaker; | ||
1391 | * setting the connection to 0 (=0x19) makes the master volume control | ||
1392 | * working mysteriouslly... | ||
1393 | */ | ||
1394 | {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
1395 | /* Record selector: Ext Mic */ | ||
1396 | {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, | ||
1397 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, | ||
1398 | AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17}, | ||
1399 | /* Speaker routing */ | ||
1400 | {0x1d, AC_VERB_SET_CONNECT_SEL,0x1}, | ||
1401 | {} | 1340 | {} |
1402 | }; | 1341 | }; |
1403 | 1342 | ||
@@ -1562,10 +1501,9 @@ static const char *cxt5047_models[CXT5047_MODELS] = { | |||
1562 | }; | 1501 | }; |
1563 | 1502 | ||
1564 | static struct snd_pci_quirk cxt5047_cfg_tbl[] = { | 1503 | static struct snd_pci_quirk cxt5047_cfg_tbl[] = { |
1565 | SND_PCI_QUIRK(0x103c, 0x30a0, "HP DV1000", CXT5047_LAPTOP), | ||
1566 | SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP), | 1504 | SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP), |
1567 | SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP), | 1505 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP DV Series", |
1568 | SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP), | 1506 | CXT5047_LAPTOP), |
1569 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD), | 1507 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD), |
1570 | {} | 1508 | {} |
1571 | }; | 1509 | }; |
@@ -1579,6 +1517,7 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1579 | if (!spec) | 1517 | if (!spec) |
1580 | return -ENOMEM; | 1518 | return -ENOMEM; |
1581 | codec->spec = spec; | 1519 | codec->spec = spec; |
1520 | codec->pin_amp_workaround = 1; | ||
1582 | 1521 | ||
1583 | spec->multiout.max_channels = 2; | 1522 | spec->multiout.max_channels = 2; |
1584 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5047_dac_nids); | 1523 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5047_dac_nids); |
@@ -1587,9 +1526,8 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1587 | spec->num_adc_nids = 1; | 1526 | spec->num_adc_nids = 1; |
1588 | spec->adc_nids = cxt5047_adc_nids; | 1527 | spec->adc_nids = cxt5047_adc_nids; |
1589 | spec->capsrc_nids = cxt5047_capsrc_nids; | 1528 | spec->capsrc_nids = cxt5047_capsrc_nids; |
1590 | spec->input_mux = &cxt5047_capture_source; | ||
1591 | spec->num_mixers = 1; | 1529 | spec->num_mixers = 1; |
1592 | spec->mixers[0] = cxt5047_mixers; | 1530 | spec->mixers[0] = cxt5047_base_mixers; |
1593 | spec->num_init_verbs = 1; | 1531 | spec->num_init_verbs = 1; |
1594 | spec->init_verbs[0] = cxt5047_init_verbs; | 1532 | spec->init_verbs[0] = cxt5047_init_verbs; |
1595 | spec->spdif_route = 0; | 1533 | spec->spdif_route = 0; |
@@ -1603,21 +1541,22 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1603 | cxt5047_cfg_tbl); | 1541 | cxt5047_cfg_tbl); |
1604 | switch (board_config) { | 1542 | switch (board_config) { |
1605 | case CXT5047_LAPTOP: | 1543 | case CXT5047_LAPTOP: |
1606 | codec->patch_ops.unsol_event = cxt5047_hp2_unsol_event; | 1544 | spec->num_mixers = 2; |
1545 | spec->mixers[1] = cxt5047_hp_spk_mixers; | ||
1546 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | ||
1607 | break; | 1547 | break; |
1608 | case CXT5047_LAPTOP_HP: | 1548 | case CXT5047_LAPTOP_HP: |
1609 | spec->input_mux = &cxt5047_hp_capture_source; | 1549 | spec->num_mixers = 2; |
1610 | spec->num_init_verbs = 2; | 1550 | spec->mixers[1] = cxt5047_hp_only_mixers; |
1611 | spec->init_verbs[1] = cxt5047_hp_init_verbs; | ||
1612 | spec->mixers[0] = cxt5047_hp_mixers; | ||
1613 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | 1551 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; |
1614 | codec->patch_ops.init = cxt5047_hp_init; | 1552 | codec->patch_ops.init = cxt5047_hp_init; |
1615 | break; | 1553 | break; |
1616 | case CXT5047_LAPTOP_EAPD: | 1554 | case CXT5047_LAPTOP_EAPD: |
1617 | spec->input_mux = &cxt5047_toshiba_capture_source; | 1555 | spec->input_mux = &cxt5047_toshiba_capture_source; |
1556 | spec->num_mixers = 2; | ||
1557 | spec->mixers[1] = cxt5047_hp_spk_mixers; | ||
1618 | spec->num_init_verbs = 2; | 1558 | spec->num_init_verbs = 2; |
1619 | spec->init_verbs[1] = cxt5047_toshiba_init_verbs; | 1559 | spec->init_verbs[1] = cxt5047_toshiba_init_verbs; |
1620 | spec->mixers[0] = cxt5047_toshiba_mixers; | ||
1621 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | 1560 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; |
1622 | break; | 1561 | break; |
1623 | #ifdef CONFIG_SND_DEBUG | 1562 | #ifdef CONFIG_SND_DEBUG |
@@ -1628,6 +1567,7 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1628 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | 1567 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; |
1629 | #endif | 1568 | #endif |
1630 | } | 1569 | } |
1570 | spec->vmaster_nid = 0x13; | ||
1631 | return 0; | 1571 | return 0; |
1632 | } | 1572 | } |
1633 | 1573 | ||
@@ -1663,8 +1603,11 @@ static int cxt5051_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
1663 | /* toggle input of built-in and mic jack appropriately */ | 1603 | /* toggle input of built-in and mic jack appropriately */ |
1664 | static void cxt5051_portb_automic(struct hda_codec *codec) | 1604 | static void cxt5051_portb_automic(struct hda_codec *codec) |
1665 | { | 1605 | { |
1606 | struct conexant_spec *spec = codec->spec; | ||
1666 | unsigned int present; | 1607 | unsigned int present; |
1667 | 1608 | ||
1609 | if (spec->no_auto_mic) | ||
1610 | return; | ||
1668 | present = snd_hda_codec_read(codec, 0x17, 0, | 1611 | present = snd_hda_codec_read(codec, 0x17, 0, |
1669 | AC_VERB_GET_PIN_SENSE, 0) & | 1612 | AC_VERB_GET_PIN_SENSE, 0) & |
1670 | AC_PINSENSE_PRESENCE; | 1613 | AC_PINSENSE_PRESENCE; |
@@ -1680,6 +1623,8 @@ static void cxt5051_portc_automic(struct hda_codec *codec) | |||
1680 | unsigned int present; | 1623 | unsigned int present; |
1681 | hda_nid_t new_adc; | 1624 | hda_nid_t new_adc; |
1682 | 1625 | ||
1626 | if (spec->no_auto_mic) | ||
1627 | return; | ||
1683 | present = snd_hda_codec_read(codec, 0x18, 0, | 1628 | present = snd_hda_codec_read(codec, 0x18, 0, |
1684 | AC_VERB_GET_PIN_SENSE, 0) & | 1629 | AC_VERB_GET_PIN_SENSE, 0) & |
1685 | AC_PINSENSE_PRESENCE; | 1630 | AC_PINSENSE_PRESENCE; |
@@ -1766,6 +1711,22 @@ static struct snd_kcontrol_new cxt5051_hp_mixers[] = { | |||
1766 | {} | 1711 | {} |
1767 | }; | 1712 | }; |
1768 | 1713 | ||
1714 | static struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = { | ||
1715 | HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x00, HDA_INPUT), | ||
1716 | HDA_CODEC_MUTE("Mic Switch", 0x14, 0x00, HDA_INPUT), | ||
1717 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), | ||
1718 | { | ||
1719 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1720 | .name = "Master Playback Switch", | ||
1721 | .info = cxt_eapd_info, | ||
1722 | .get = cxt_eapd_get, | ||
1723 | .put = cxt5051_hp_master_sw_put, | ||
1724 | .private_value = 0x1a, | ||
1725 | }, | ||
1726 | |||
1727 | {} | ||
1728 | }; | ||
1729 | |||
1769 | static struct hda_verb cxt5051_init_verbs[] = { | 1730 | static struct hda_verb cxt5051_init_verbs[] = { |
1770 | /* Line in, Mic */ | 1731 | /* Line in, Mic */ |
1771 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, | 1732 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, |
@@ -1796,6 +1757,66 @@ static struct hda_verb cxt5051_init_verbs[] = { | |||
1796 | { } /* end */ | 1757 | { } /* end */ |
1797 | }; | 1758 | }; |
1798 | 1759 | ||
1760 | static struct hda_verb cxt5051_hp_dv6736_init_verbs[] = { | ||
1761 | /* Line in, Mic */ | ||
1762 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, | ||
1763 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
1764 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, | ||
1765 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, | ||
1766 | /* SPK */ | ||
1767 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
1768 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1769 | /* HP, Amp */ | ||
1770 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
1771 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1772 | /* DAC1 */ | ||
1773 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1774 | /* Record selector: Int mic */ | ||
1775 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44}, | ||
1776 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x1}, | ||
1777 | /* SPDIF route: PCM */ | ||
1778 | {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
1779 | /* EAPD */ | ||
1780 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | ||
1781 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | ||
1782 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
1783 | { } /* end */ | ||
1784 | }; | ||
1785 | |||
1786 | static struct hda_verb cxt5051_lenovo_x200_init_verbs[] = { | ||
1787 | /* Line in, Mic */ | ||
1788 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, | ||
1789 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
1790 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, | ||
1791 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
1792 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
1793 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, | ||
1794 | /* SPK */ | ||
1795 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
1796 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1797 | /* HP, Amp */ | ||
1798 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
1799 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1800 | /* Docking HP */ | ||
1801 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
1802 | {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1803 | /* DAC1 */ | ||
1804 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1805 | /* Record selector: Int mic */ | ||
1806 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44}, | ||
1807 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44}, | ||
1808 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44}, | ||
1809 | /* SPDIF route: PCM */ | ||
1810 | {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
1811 | /* EAPD */ | ||
1812 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | ||
1813 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | ||
1814 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
1815 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTC_EVENT}, | ||
1816 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | ||
1817 | { } /* end */ | ||
1818 | }; | ||
1819 | |||
1799 | /* initialize jack-sensing, too */ | 1820 | /* initialize jack-sensing, too */ |
1800 | static int cxt5051_init(struct hda_codec *codec) | 1821 | static int cxt5051_init(struct hda_codec *codec) |
1801 | { | 1822 | { |
@@ -1813,18 +1834,24 @@ static int cxt5051_init(struct hda_codec *codec) | |||
1813 | enum { | 1834 | enum { |
1814 | CXT5051_LAPTOP, /* Laptops w/ EAPD support */ | 1835 | CXT5051_LAPTOP, /* Laptops w/ EAPD support */ |
1815 | CXT5051_HP, /* no docking */ | 1836 | CXT5051_HP, /* no docking */ |
1837 | CXT5051_HP_DV6736, /* HP without mic switch */ | ||
1838 | CXT5051_LENOVO_X200, /* Lenovo X200 laptop */ | ||
1816 | CXT5051_MODELS | 1839 | CXT5051_MODELS |
1817 | }; | 1840 | }; |
1818 | 1841 | ||
1819 | static const char *cxt5051_models[CXT5051_MODELS] = { | 1842 | static const char *cxt5051_models[CXT5051_MODELS] = { |
1820 | [CXT5051_LAPTOP] = "laptop", | 1843 | [CXT5051_LAPTOP] = "laptop", |
1821 | [CXT5051_HP] = "hp", | 1844 | [CXT5051_HP] = "hp", |
1845 | [CXT5051_HP_DV6736] = "hp-dv6736", | ||
1846 | [CXT5051_LENOVO_X200] = "lenovo-x200", | ||
1822 | }; | 1847 | }; |
1823 | 1848 | ||
1824 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { | 1849 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { |
1850 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), | ||
1825 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", | 1851 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", |
1826 | CXT5051_LAPTOP), | 1852 | CXT5051_LAPTOP), |
1827 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), | 1853 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), |
1854 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), | ||
1828 | {} | 1855 | {} |
1829 | }; | 1856 | }; |
1830 | 1857 | ||
@@ -1837,6 +1864,7 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
1837 | if (!spec) | 1864 | if (!spec) |
1838 | return -ENOMEM; | 1865 | return -ENOMEM; |
1839 | codec->spec = spec; | 1866 | codec->spec = spec; |
1867 | codec->pin_amp_workaround = 1; | ||
1840 | 1868 | ||
1841 | codec->patch_ops = conexant_patch_ops; | 1869 | codec->patch_ops = conexant_patch_ops; |
1842 | codec->patch_ops.init = cxt5051_init; | 1870 | codec->patch_ops.init = cxt5051_init; |
@@ -1857,17 +1885,22 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
1857 | spec->cur_adc = 0; | 1885 | spec->cur_adc = 0; |
1858 | spec->cur_adc_idx = 0; | 1886 | spec->cur_adc_idx = 0; |
1859 | 1887 | ||
1888 | codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; | ||
1889 | |||
1860 | board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, | 1890 | board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, |
1861 | cxt5051_models, | 1891 | cxt5051_models, |
1862 | cxt5051_cfg_tbl); | 1892 | cxt5051_cfg_tbl); |
1863 | switch (board_config) { | 1893 | switch (board_config) { |
1864 | case CXT5051_HP: | 1894 | case CXT5051_HP: |
1865 | codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; | ||
1866 | spec->mixers[0] = cxt5051_hp_mixers; | 1895 | spec->mixers[0] = cxt5051_hp_mixers; |
1867 | break; | 1896 | break; |
1868 | default: | 1897 | case CXT5051_HP_DV6736: |
1869 | case CXT5051_LAPTOP: | 1898 | spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs; |
1870 | codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; | 1899 | spec->mixers[0] = cxt5051_hp_dv6736_mixers; |
1900 | spec->no_auto_mic = 1; | ||
1901 | break; | ||
1902 | case CXT5051_LENOVO_X200: | ||
1903 | spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs; | ||
1871 | break; | 1904 | break; |
1872 | } | 1905 | } |
1873 | 1906 | ||
diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index 3564f4e4b74c..fcc77fec4487 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c | |||
@@ -49,11 +49,6 @@ static struct hda_verb pinout_enable_verb[] = { | |||
49 | {} /* terminator */ | 49 | {} /* terminator */ |
50 | }; | 50 | }; |
51 | 51 | ||
52 | static struct hda_verb pinout_disable_verb[] = { | ||
53 | {PIN_NID, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00}, | ||
54 | {} | ||
55 | }; | ||
56 | |||
57 | static struct hda_verb unsolicited_response_verb[] = { | 52 | static struct hda_verb unsolicited_response_verb[] = { |
58 | {PIN_NID, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | | 53 | {PIN_NID, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | |
59 | INTEL_HDMI_EVENT_TAG}, | 54 | INTEL_HDMI_EVENT_TAG}, |
@@ -248,10 +243,6 @@ static void hdmi_write_dip_byte(struct hda_codec *codec, hda_nid_t nid, | |||
248 | 243 | ||
249 | static void hdmi_enable_output(struct hda_codec *codec) | 244 | static void hdmi_enable_output(struct hda_codec *codec) |
250 | { | 245 | { |
251 | /* Enable Audio InfoFrame Transmission */ | ||
252 | hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0); | ||
253 | snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT, | ||
254 | AC_DIPXMIT_BEST); | ||
255 | /* Unmute */ | 246 | /* Unmute */ |
256 | if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP) | 247 | if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP) |
257 | snd_hda_codec_write(codec, PIN_NID, 0, | 248 | snd_hda_codec_write(codec, PIN_NID, 0, |
@@ -260,17 +251,24 @@ static void hdmi_enable_output(struct hda_codec *codec) | |||
260 | snd_hda_sequence_write(codec, pinout_enable_verb); | 251 | snd_hda_sequence_write(codec, pinout_enable_verb); |
261 | } | 252 | } |
262 | 253 | ||
263 | static void hdmi_disable_output(struct hda_codec *codec) | 254 | /* |
255 | * Enable Audio InfoFrame Transmission | ||
256 | */ | ||
257 | static void hdmi_start_infoframe_trans(struct hda_codec *codec) | ||
264 | { | 258 | { |
265 | snd_hda_sequence_write(codec, pinout_disable_verb); | 259 | hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0); |
266 | if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP) | 260 | snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT, |
267 | snd_hda_codec_write(codec, PIN_NID, 0, | 261 | AC_DIPXMIT_BEST); |
268 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | 262 | } |
269 | 263 | ||
270 | /* | 264 | /* |
271 | * FIXME: noises may arise when playing music after reloading the | 265 | * Disable Audio InfoFrame Transmission |
272 | * kernel module, until the next X restart or monitor repower. | 266 | */ |
273 | */ | 267 | static void hdmi_stop_infoframe_trans(struct hda_codec *codec) |
268 | { | ||
269 | hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0); | ||
270 | snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT, | ||
271 | AC_DIPXMIT_DISABLE); | ||
274 | } | 272 | } |
275 | 273 | ||
276 | static int hdmi_get_channel_count(struct hda_codec *codec) | 274 | static int hdmi_get_channel_count(struct hda_codec *codec) |
@@ -368,11 +366,16 @@ static void hdmi_fill_audio_infoframe(struct hda_codec *codec, | |||
368 | struct hdmi_audio_infoframe *ai) | 366 | struct hdmi_audio_infoframe *ai) |
369 | { | 367 | { |
370 | u8 *params = (u8 *)ai; | 368 | u8 *params = (u8 *)ai; |
369 | u8 sum = 0; | ||
371 | int i; | 370 | int i; |
372 | 371 | ||
373 | hdmi_debug_dip_size(codec); | 372 | hdmi_debug_dip_size(codec); |
374 | hdmi_clear_dip_buffers(codec); /* be paranoid */ | 373 | hdmi_clear_dip_buffers(codec); /* be paranoid */ |
375 | 374 | ||
375 | for (i = 0; i < sizeof(ai); i++) | ||
376 | sum += params[i]; | ||
377 | ai->checksum = - sum; | ||
378 | |||
376 | hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0); | 379 | hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0); |
377 | for (i = 0; i < sizeof(ai); i++) | 380 | for (i = 0; i < sizeof(ai); i++) |
378 | hdmi_write_dip_byte(codec, PIN_NID, params[i]); | 381 | hdmi_write_dip_byte(codec, PIN_NID, params[i]); |
@@ -419,14 +422,18 @@ static int hdmi_setup_channel_allocation(struct hda_codec *codec, | |||
419 | /* | 422 | /* |
420 | * CA defaults to 0 for basic stereo audio | 423 | * CA defaults to 0 for basic stereo audio |
421 | */ | 424 | */ |
422 | if (!eld->eld_ver) | ||
423 | return 0; | ||
424 | if (!eld->spk_alloc) | ||
425 | return 0; | ||
426 | if (channels <= 2) | 425 | if (channels <= 2) |
427 | return 0; | 426 | return 0; |
428 | 427 | ||
429 | /* | 428 | /* |
429 | * HDMI sink's ELD info cannot always be retrieved for now, e.g. | ||
430 | * in console or for audio devices. Assume the highest speakers | ||
431 | * configuration, to _not_ prohibit multi-channel audio playback. | ||
432 | */ | ||
433 | if (!eld->spk_alloc) | ||
434 | eld->spk_alloc = 0xffff; | ||
435 | |||
436 | /* | ||
430 | * expand ELD's speaker allocation mask | 437 | * expand ELD's speaker allocation mask |
431 | * | 438 | * |
432 | * ELD tells the speaker mask in a compact(paired) form, | 439 | * ELD tells the speaker mask in a compact(paired) form, |
@@ -485,6 +492,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, | |||
485 | hdmi_setup_channel_mapping(codec, &ai); | 492 | hdmi_setup_channel_mapping(codec, &ai); |
486 | 493 | ||
487 | hdmi_fill_audio_infoframe(codec, &ai); | 494 | hdmi_fill_audio_infoframe(codec, &ai); |
495 | hdmi_start_infoframe_trans(codec); | ||
488 | } | 496 | } |
489 | 497 | ||
490 | 498 | ||
@@ -562,7 +570,7 @@ static int intel_hdmi_playback_pcm_close(struct hda_pcm_stream *hinfo, | |||
562 | { | 570 | { |
563 | struct intel_hdmi_spec *spec = codec->spec; | 571 | struct intel_hdmi_spec *spec = codec->spec; |
564 | 572 | ||
565 | hdmi_disable_output(codec); | 573 | hdmi_stop_infoframe_trans(codec); |
566 | 574 | ||
567 | return snd_hda_multi_out_dig_close(codec, &spec->multiout); | 575 | return snd_hda_multi_out_dig_close(codec, &spec->multiout); |
568 | } | 576 | } |
@@ -582,8 +590,6 @@ static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
582 | 590 | ||
583 | hdmi_setup_audio_infoframe(codec, substream); | 591 | hdmi_setup_audio_infoframe(codec, substream); |
584 | 592 | ||
585 | hdmi_enable_output(codec); | ||
586 | |||
587 | return 0; | 593 | return 0; |
588 | } | 594 | } |
589 | 595 | ||
@@ -628,8 +634,7 @@ static int intel_hdmi_build_controls(struct hda_codec *codec) | |||
628 | 634 | ||
629 | static int intel_hdmi_init(struct hda_codec *codec) | 635 | static int intel_hdmi_init(struct hda_codec *codec) |
630 | { | 636 | { |
631 | /* disable audio output as early as possible */ | 637 | hdmi_enable_output(codec); |
632 | hdmi_disable_output(codec); | ||
633 | 638 | ||
634 | snd_hda_sequence_write(codec, unsolicited_response_verb); | 639 | snd_hda_sequence_write(codec, unsolicited_response_verb); |
635 | 640 | ||
@@ -679,6 +684,7 @@ static struct hda_codec_preset snd_hda_preset_intelhdmi[] = { | |||
679 | { .id = 0x80862801, .name = "G45 DEVBLC", .patch = patch_intel_hdmi }, | 684 | { .id = 0x80862801, .name = "G45 DEVBLC", .patch = patch_intel_hdmi }, |
680 | { .id = 0x80862802, .name = "G45 DEVCTG", .patch = patch_intel_hdmi }, | 685 | { .id = 0x80862802, .name = "G45 DEVCTG", .patch = patch_intel_hdmi }, |
681 | { .id = 0x80862803, .name = "G45 DEVELK", .patch = patch_intel_hdmi }, | 686 | { .id = 0x80862803, .name = "G45 DEVELK", .patch = patch_intel_hdmi }, |
687 | { .id = 0x80862804, .name = "G45 DEVIBX", .patch = patch_intel_hdmi }, | ||
682 | { .id = 0x10951392, .name = "SiI1392 HDMI", .patch = patch_intel_hdmi }, | 688 | { .id = 0x10951392, .name = "SiI1392 HDMI", .patch = patch_intel_hdmi }, |
683 | {} /* terminator */ | 689 | {} /* terminator */ |
684 | }; | 690 | }; |
@@ -687,6 +693,7 @@ MODULE_ALIAS("snd-hda-codec-id:808629fb"); | |||
687 | MODULE_ALIAS("snd-hda-codec-id:80862801"); | 693 | MODULE_ALIAS("snd-hda-codec-id:80862801"); |
688 | MODULE_ALIAS("snd-hda-codec-id:80862802"); | 694 | MODULE_ALIAS("snd-hda-codec-id:80862802"); |
689 | MODULE_ALIAS("snd-hda-codec-id:80862803"); | 695 | MODULE_ALIAS("snd-hda-codec-id:80862803"); |
696 | MODULE_ALIAS("snd-hda-codec-id:80862804"); | ||
690 | MODULE_ALIAS("snd-hda-codec-id:10951392"); | 697 | MODULE_ALIAS("snd-hda-codec-id:10951392"); |
691 | 698 | ||
692 | MODULE_LICENSE("GPL"); | 699 | MODULE_LICENSE("GPL"); |
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index 96952a37d884..d57d8132a06e 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
@@ -160,6 +160,7 @@ static int patch_nvhdmi(struct hda_codec *codec) | |||
160 | */ | 160 | */ |
161 | static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { | 161 | static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { |
162 | { .id = 0x10de0002, .name = "MCP78 HDMI", .patch = patch_nvhdmi }, | 162 | { .id = 0x10de0002, .name = "MCP78 HDMI", .patch = patch_nvhdmi }, |
163 | { .id = 0x10de0006, .name = "MCP78 HDMI", .patch = patch_nvhdmi }, | ||
163 | { .id = 0x10de0007, .name = "MCP7A HDMI", .patch = patch_nvhdmi }, | 164 | { .id = 0x10de0007, .name = "MCP7A HDMI", .patch = patch_nvhdmi }, |
164 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi }, | 165 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi }, |
165 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi }, | 166 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi }, |
@@ -167,6 +168,7 @@ static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { | |||
167 | }; | 168 | }; |
168 | 169 | ||
169 | MODULE_ALIAS("snd-hda-codec-id:10de0002"); | 170 | MODULE_ALIAS("snd-hda-codec-id:10de0002"); |
171 | MODULE_ALIAS("snd-hda-codec-id:10de0006"); | ||
170 | MODULE_ALIAS("snd-hda-codec-id:10de0007"); | 172 | MODULE_ALIAS("snd-hda-codec-id:10de0007"); |
171 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); | 173 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); |
172 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); | 174 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index ea4c88fe05c4..b8a0d3e79272 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <sound/core.h> | 30 | #include <sound/core.h> |
31 | #include "hda_codec.h" | 31 | #include "hda_codec.h" |
32 | #include "hda_local.h" | 32 | #include "hda_local.h" |
33 | #include "hda_beep.h" | ||
33 | 34 | ||
34 | #define ALC880_FRONT_EVENT 0x01 | 35 | #define ALC880_FRONT_EVENT 0x01 |
35 | #define ALC880_DCVOL_EVENT 0x02 | 36 | #define ALC880_DCVOL_EVENT 0x02 |
@@ -77,6 +78,7 @@ enum { | |||
77 | ALC260_ACER, | 78 | ALC260_ACER, |
78 | ALC260_WILL, | 79 | ALC260_WILL, |
79 | ALC260_REPLACER_672V, | 80 | ALC260_REPLACER_672V, |
81 | ALC260_FAVORIT100, | ||
80 | #ifdef CONFIG_SND_DEBUG | 82 | #ifdef CONFIG_SND_DEBUG |
81 | ALC260_TEST, | 83 | ALC260_TEST, |
82 | #endif | 84 | #endif |
@@ -103,6 +105,7 @@ enum { | |||
103 | ALC262_NEC, | 105 | ALC262_NEC, |
104 | ALC262_TOSHIBA_S06, | 106 | ALC262_TOSHIBA_S06, |
105 | ALC262_TOSHIBA_RX1, | 107 | ALC262_TOSHIBA_RX1, |
108 | ALC262_TYAN, | ||
106 | ALC262_AUTO, | 109 | ALC262_AUTO, |
107 | ALC262_MODEL_LAST /* last tag */ | 110 | ALC262_MODEL_LAST /* last tag */ |
108 | }; | 111 | }; |
@@ -185,6 +188,8 @@ enum { | |||
185 | ALC663_ASUS_MODE4, | 188 | ALC663_ASUS_MODE4, |
186 | ALC663_ASUS_MODE5, | 189 | ALC663_ASUS_MODE5, |
187 | ALC663_ASUS_MODE6, | 190 | ALC663_ASUS_MODE6, |
191 | ALC272_DELL, | ||
192 | ALC272_DELL_ZM1, | ||
188 | ALC662_AUTO, | 193 | ALC662_AUTO, |
189 | ALC662_MODEL_LAST, | 194 | ALC662_MODEL_LAST, |
190 | }; | 195 | }; |
@@ -238,6 +243,13 @@ enum { | |||
238 | ALC883_MODEL_LAST, | 243 | ALC883_MODEL_LAST, |
239 | }; | 244 | }; |
240 | 245 | ||
246 | /* styles of capture selection */ | ||
247 | enum { | ||
248 | CAPT_MUX = 0, /* only mux based */ | ||
249 | CAPT_MIX, /* only mixer based */ | ||
250 | CAPT_1MUX_MIX, /* first mux and other mixers */ | ||
251 | }; | ||
252 | |||
241 | /* for GPIO Poll */ | 253 | /* for GPIO Poll */ |
242 | #define GPIO_MASK 0x03 | 254 | #define GPIO_MASK 0x03 |
243 | 255 | ||
@@ -246,6 +258,7 @@ struct alc_spec { | |||
246 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 258 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
247 | unsigned int num_mixers; | 259 | unsigned int num_mixers; |
248 | struct snd_kcontrol_new *cap_mixer; /* capture mixer */ | 260 | struct snd_kcontrol_new *cap_mixer; /* capture mixer */ |
261 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ | ||
249 | 262 | ||
250 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 263 | const struct hda_verb *init_verbs[5]; /* initialization verbs |
251 | * don't forget NULL | 264 | * don't forget NULL |
@@ -269,13 +282,15 @@ struct alc_spec { | |||
269 | * dig_out_nid and hp_nid are optional | 282 | * dig_out_nid and hp_nid are optional |
270 | */ | 283 | */ |
271 | hda_nid_t alt_dac_nid; | 284 | hda_nid_t alt_dac_nid; |
285 | hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */ | ||
286 | int dig_out_type; | ||
272 | 287 | ||
273 | /* capture */ | 288 | /* capture */ |
274 | unsigned int num_adc_nids; | 289 | unsigned int num_adc_nids; |
275 | hda_nid_t *adc_nids; | 290 | hda_nid_t *adc_nids; |
276 | hda_nid_t *capsrc_nids; | 291 | hda_nid_t *capsrc_nids; |
277 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ | 292 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ |
278 | unsigned char is_mix_capture; /* matrix-style capture (non-mux) */ | 293 | int capture_style; /* capture style (CAPT_*) */ |
279 | 294 | ||
280 | /* capture source */ | 295 | /* capture source */ |
281 | unsigned int num_mux_defs; | 296 | unsigned int num_mux_defs; |
@@ -293,7 +308,7 @@ struct alc_spec { | |||
293 | /* dynamic controls, init_verbs and input_mux */ | 308 | /* dynamic controls, init_verbs and input_mux */ |
294 | struct auto_pin_cfg autocfg; | 309 | struct auto_pin_cfg autocfg; |
295 | struct snd_array kctls; | 310 | struct snd_array kctls; |
296 | struct hda_input_mux private_imux; | 311 | struct hda_input_mux private_imux[3]; |
297 | hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; | 312 | hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; |
298 | 313 | ||
299 | /* hooks */ | 314 | /* hooks */ |
@@ -305,6 +320,9 @@ struct alc_spec { | |||
305 | unsigned int jack_present: 1; | 320 | unsigned int jack_present: 1; |
306 | unsigned int master_sw: 1; | 321 | unsigned int master_sw: 1; |
307 | 322 | ||
323 | /* other flags */ | ||
324 | unsigned int no_analog :1; /* digital I/O only */ | ||
325 | |||
308 | /* for virtual master */ | 326 | /* for virtual master */ |
309 | hda_nid_t vmaster_nid; | 327 | hda_nid_t vmaster_nid; |
310 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 328 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
@@ -314,13 +332,6 @@ struct alc_spec { | |||
314 | /* for PLL fix */ | 332 | /* for PLL fix */ |
315 | hda_nid_t pll_nid; | 333 | hda_nid_t pll_nid; |
316 | unsigned int pll_coef_idx, pll_coef_bit; | 334 | unsigned int pll_coef_idx, pll_coef_bit; |
317 | |||
318 | #ifdef SND_HDA_NEEDS_RESUME | ||
319 | #define ALC_MAX_PINS 16 | ||
320 | unsigned int num_pins; | ||
321 | hda_nid_t pin_nids[ALC_MAX_PINS]; | ||
322 | unsigned int pin_cfgs[ALC_MAX_PINS]; | ||
323 | #endif | ||
324 | }; | 335 | }; |
325 | 336 | ||
326 | /* | 337 | /* |
@@ -336,6 +347,7 @@ struct alc_config_preset { | |||
336 | hda_nid_t *dac_nids; | 347 | hda_nid_t *dac_nids; |
337 | hda_nid_t dig_out_nid; /* optional */ | 348 | hda_nid_t dig_out_nid; /* optional */ |
338 | hda_nid_t hp_nid; /* optional */ | 349 | hda_nid_t hp_nid; /* optional */ |
350 | hda_nid_t *slave_dig_outs; | ||
339 | unsigned int num_adc_nids; | 351 | unsigned int num_adc_nids; |
340 | hda_nid_t *adc_nids; | 352 | hda_nid_t *adc_nids; |
341 | hda_nid_t *capsrc_nids; | 353 | hda_nid_t *capsrc_nids; |
@@ -392,7 +404,8 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, | |||
392 | mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; | 404 | mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; |
393 | imux = &spec->input_mux[mux_idx]; | 405 | imux = &spec->input_mux[mux_idx]; |
394 | 406 | ||
395 | if (spec->is_mix_capture) { | 407 | if (spec->capture_style && |
408 | !(spec->capture_style == CAPT_1MUX_MIX && !adc_idx)) { | ||
396 | /* Matrix-mixer style (e.g. ALC882) */ | 409 | /* Matrix-mixer style (e.g. ALC882) */ |
397 | unsigned int *cur_val = &spec->cur_mux[adc_idx]; | 410 | unsigned int *cur_val = &spec->cur_mux[adc_idx]; |
398 | unsigned int i, idx; | 411 | unsigned int i, idx; |
@@ -750,6 +763,24 @@ static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol, | |||
750 | #endif /* CONFIG_SND_DEBUG */ | 763 | #endif /* CONFIG_SND_DEBUG */ |
751 | 764 | ||
752 | /* | 765 | /* |
766 | * set up the input pin config (depending on the given auto-pin type) | ||
767 | */ | ||
768 | static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid, | ||
769 | int auto_pin_type) | ||
770 | { | ||
771 | unsigned int val = PIN_IN; | ||
772 | |||
773 | if (auto_pin_type <= AUTO_PIN_FRONT_MIC) { | ||
774 | unsigned int pincap; | ||
775 | pincap = snd_hda_query_pin_caps(codec, nid); | ||
776 | pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; | ||
777 | if (pincap & AC_PINCAP_VREF_80) | ||
778 | val = PIN_VREF80; | ||
779 | } | ||
780 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val); | ||
781 | } | ||
782 | |||
783 | /* | ||
753 | */ | 784 | */ |
754 | static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) | 785 | static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) |
755 | { | 786 | { |
@@ -810,6 +841,7 @@ static void setup_preset(struct alc_spec *spec, | |||
810 | spec->multiout.num_dacs = preset->num_dacs; | 841 | spec->multiout.num_dacs = preset->num_dacs; |
811 | spec->multiout.dac_nids = preset->dac_nids; | 842 | spec->multiout.dac_nids = preset->dac_nids; |
812 | spec->multiout.dig_out_nid = preset->dig_out_nid; | 843 | spec->multiout.dig_out_nid = preset->dig_out_nid; |
844 | spec->multiout.slave_dig_outs = preset->slave_dig_outs; | ||
813 | spec->multiout.hp_nid = preset->hp_nid; | 845 | spec->multiout.hp_nid = preset->hp_nid; |
814 | 846 | ||
815 | spec->num_mux_defs = preset->num_mux_defs; | 847 | spec->num_mux_defs = preset->num_mux_defs; |
@@ -921,7 +953,7 @@ static void alc_mic_automute(struct hda_codec *codec) | |||
921 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | 953 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); |
922 | } | 954 | } |
923 | #else | 955 | #else |
924 | #define alc_mic_automute(codec) /* NOP */ | 956 | #define alc_mic_automute(codec) do {} while(0) /* NOP */ |
925 | #endif /* disabled */ | 957 | #endif /* disabled */ |
926 | 958 | ||
927 | /* unsolicited event for HP jack sensing */ | 959 | /* unsolicited event for HP jack sensing */ |
@@ -952,7 +984,7 @@ static void alc888_coef_init(struct hda_codec *codec) | |||
952 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0); | 984 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0); |
953 | tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); | 985 | tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); |
954 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); | 986 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); |
955 | if ((tmp & 0xf0) == 2) | 987 | if ((tmp & 0xf0) == 0x20) |
956 | /* alc888S-VC */ | 988 | /* alc888S-VC */ |
957 | snd_hda_codec_read(codec, 0x20, 0, | 989 | snd_hda_codec_read(codec, 0x20, 0, |
958 | AC_VERB_SET_PROC_COEF, 0x830); | 990 | AC_VERB_SET_PROC_COEF, 0x830); |
@@ -991,8 +1023,7 @@ static void alc_subsystem_id(struct hda_codec *codec, | |||
991 | nid = 0x1d; | 1023 | nid = 0x1d; |
992 | if (codec->vendor_id == 0x10ec0260) | 1024 | if (codec->vendor_id == 0x10ec0260) |
993 | nid = 0x17; | 1025 | nid = 0x17; |
994 | ass = snd_hda_codec_read(codec, nid, 0, | 1026 | ass = snd_hda_codec_get_pincfg(codec, nid); |
995 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
996 | if (!(ass & 1) && !(ass & 0x100000)) | 1027 | if (!(ass & 1) && !(ass & 0x100000)) |
997 | return; | 1028 | return; |
998 | if ((ass >> 30) != 1) /* no physical connection */ | 1029 | if ((ass >> 30) != 1) /* no physical connection */ |
@@ -1037,6 +1068,7 @@ do_sku: | |||
1037 | case 0x10ec0267: | 1068 | case 0x10ec0267: |
1038 | case 0x10ec0268: | 1069 | case 0x10ec0268: |
1039 | case 0x10ec0269: | 1070 | case 0x10ec0269: |
1071 | case 0x10ec0272: | ||
1040 | case 0x10ec0660: | 1072 | case 0x10ec0660: |
1041 | case 0x10ec0662: | 1073 | case 0x10ec0662: |
1042 | case 0x10ec0663: | 1074 | case 0x10ec0663: |
@@ -1065,6 +1097,7 @@ do_sku: | |||
1065 | case 0x10ec0882: | 1097 | case 0x10ec0882: |
1066 | case 0x10ec0883: | 1098 | case 0x10ec0883: |
1067 | case 0x10ec0885: | 1099 | case 0x10ec0885: |
1100 | case 0x10ec0887: | ||
1068 | case 0x10ec0889: | 1101 | case 0x10ec0889: |
1069 | snd_hda_codec_write(codec, 0x20, 0, | 1102 | snd_hda_codec_write(codec, 0x20, 0, |
1070 | AC_VERB_SET_COEF_INDEX, 7); | 1103 | AC_VERB_SET_COEF_INDEX, 7); |
@@ -1164,16 +1197,8 @@ static void alc_fix_pincfg(struct hda_codec *codec, | |||
1164 | return; | 1197 | return; |
1165 | 1198 | ||
1166 | cfg = pinfix[quirk->value]; | 1199 | cfg = pinfix[quirk->value]; |
1167 | for (; cfg->nid; cfg++) { | 1200 | for (; cfg->nid; cfg++) |
1168 | int i; | 1201 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); |
1169 | u32 val = cfg->val; | ||
1170 | for (i = 0; i < 4; i++) { | ||
1171 | snd_hda_codec_write(codec, cfg->nid, 0, | ||
1172 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 + i, | ||
1173 | val & 0xff); | ||
1174 | val >>= 8; | ||
1175 | } | ||
1176 | } | ||
1177 | } | 1202 | } |
1178 | 1203 | ||
1179 | /* | 1204 | /* |
@@ -1373,8 +1398,6 @@ static struct snd_kcontrol_new alc888_base_mixer[] = { | |||
1373 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 1398 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
1374 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 1399 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
1375 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 1400 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
1376 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
1377 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
1378 | { } /* end */ | 1401 | { } /* end */ |
1379 | }; | 1402 | }; |
1380 | 1403 | ||
@@ -1481,8 +1504,6 @@ static struct snd_kcontrol_new alc880_three_stack_mixer[] = { | |||
1481 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 1504 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
1482 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), | 1505 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), |
1483 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), | 1506 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), |
1484 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
1485 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
1486 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), | 1507 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), |
1487 | { | 1508 | { |
1488 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1509 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -1576,8 +1597,7 @@ static int alc_cap_sw_put(struct snd_kcontrol *kcontrol, | |||
1576 | snd_hda_mixer_amp_switch_put); | 1597 | snd_hda_mixer_amp_switch_put); |
1577 | } | 1598 | } |
1578 | 1599 | ||
1579 | #define DEFINE_CAPMIX(num) \ | 1600 | #define _DEFINE_CAPMIX(num) \ |
1580 | static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ | ||
1581 | { \ | 1601 | { \ |
1582 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | 1602 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ |
1583 | .name = "Capture Switch", \ | 1603 | .name = "Capture Switch", \ |
@@ -1598,7 +1618,9 @@ static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ | |||
1598 | .get = alc_cap_vol_get, \ | 1618 | .get = alc_cap_vol_get, \ |
1599 | .put = alc_cap_vol_put, \ | 1619 | .put = alc_cap_vol_put, \ |
1600 | .tlv = { .c = alc_cap_vol_tlv }, \ | 1620 | .tlv = { .c = alc_cap_vol_tlv }, \ |
1601 | }, \ | 1621 | } |
1622 | |||
1623 | #define _DEFINE_CAPSRC(num) \ | ||
1602 | { \ | 1624 | { \ |
1603 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | 1625 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ |
1604 | /* .name = "Capture Source", */ \ | 1626 | /* .name = "Capture Source", */ \ |
@@ -1607,15 +1629,28 @@ static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ | |||
1607 | .info = alc_mux_enum_info, \ | 1629 | .info = alc_mux_enum_info, \ |
1608 | .get = alc_mux_enum_get, \ | 1630 | .get = alc_mux_enum_get, \ |
1609 | .put = alc_mux_enum_put, \ | 1631 | .put = alc_mux_enum_put, \ |
1610 | }, \ | 1632 | } |
1611 | { } /* end */ \ | 1633 | |
1634 | #define DEFINE_CAPMIX(num) \ | ||
1635 | static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ | ||
1636 | _DEFINE_CAPMIX(num), \ | ||
1637 | _DEFINE_CAPSRC(num), \ | ||
1638 | { } /* end */ \ | ||
1639 | } | ||
1640 | |||
1641 | #define DEFINE_CAPMIX_NOSRC(num) \ | ||
1642 | static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \ | ||
1643 | _DEFINE_CAPMIX(num), \ | ||
1644 | { } /* end */ \ | ||
1612 | } | 1645 | } |
1613 | 1646 | ||
1614 | /* up to three ADCs */ | 1647 | /* up to three ADCs */ |
1615 | DEFINE_CAPMIX(1); | 1648 | DEFINE_CAPMIX(1); |
1616 | DEFINE_CAPMIX(2); | 1649 | DEFINE_CAPMIX(2); |
1617 | DEFINE_CAPMIX(3); | 1650 | DEFINE_CAPMIX(3); |
1618 | 1651 | DEFINE_CAPMIX_NOSRC(1); | |
1652 | DEFINE_CAPMIX_NOSRC(2); | ||
1653 | DEFINE_CAPMIX_NOSRC(3); | ||
1619 | 1654 | ||
1620 | /* | 1655 | /* |
1621 | * ALC880 5-stack model | 1656 | * ALC880 5-stack model |
@@ -1704,8 +1739,6 @@ static struct snd_kcontrol_new alc880_six_stack_mixer[] = { | |||
1704 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 1739 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
1705 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 1740 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
1706 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 1741 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
1707 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
1708 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
1709 | { | 1742 | { |
1710 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1743 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
1711 | .name = "Channel Mode", | 1744 | .name = "Channel Mode", |
@@ -1882,13 +1915,6 @@ static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = { | |||
1882 | { } /* end */ | 1915 | { } /* end */ |
1883 | }; | 1916 | }; |
1884 | 1917 | ||
1885 | /* additional mixers to alc880_asus_mixer */ | ||
1886 | static struct snd_kcontrol_new alc880_pcbeep_mixer[] = { | ||
1887 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
1888 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
1889 | { } /* end */ | ||
1890 | }; | ||
1891 | |||
1892 | /* TCL S700 */ | 1918 | /* TCL S700 */ |
1893 | static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { | 1919 | static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { |
1894 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 1920 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -1921,8 +1947,6 @@ static struct snd_kcontrol_new alc880_uniwill_mixer[] = { | |||
1921 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 1947 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
1922 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 1948 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
1923 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 1949 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
1924 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
1925 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
1926 | { | 1950 | { |
1927 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1951 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
1928 | .name = "Channel Mode", | 1952 | .name = "Channel Mode", |
@@ -1997,6 +2021,13 @@ static const char *alc_slave_sws[] = { | |||
1997 | 2021 | ||
1998 | static void alc_free_kctls(struct hda_codec *codec); | 2022 | static void alc_free_kctls(struct hda_codec *codec); |
1999 | 2023 | ||
2024 | /* additional beep mixers; the actual parameters are overwritten at build */ | ||
2025 | static struct snd_kcontrol_new alc_beep_mixer[] = { | ||
2026 | HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), | ||
2027 | HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_INPUT), | ||
2028 | { } /* end */ | ||
2029 | }; | ||
2030 | |||
2000 | static int alc_build_controls(struct hda_codec *codec) | 2031 | static int alc_build_controls(struct hda_codec *codec) |
2001 | { | 2032 | { |
2002 | struct alc_spec *spec = codec->spec; | 2033 | struct alc_spec *spec = codec->spec; |
@@ -2018,11 +2049,13 @@ static int alc_build_controls(struct hda_codec *codec) | |||
2018 | spec->multiout.dig_out_nid); | 2049 | spec->multiout.dig_out_nid); |
2019 | if (err < 0) | 2050 | if (err < 0) |
2020 | return err; | 2051 | return err; |
2021 | err = snd_hda_create_spdif_share_sw(codec, | 2052 | if (!spec->no_analog) { |
2022 | &spec->multiout); | 2053 | err = snd_hda_create_spdif_share_sw(codec, |
2023 | if (err < 0) | 2054 | &spec->multiout); |
2024 | return err; | 2055 | if (err < 0) |
2025 | spec->multiout.share_spdif = 1; | 2056 | return err; |
2057 | spec->multiout.share_spdif = 1; | ||
2058 | } | ||
2026 | } | 2059 | } |
2027 | if (spec->dig_in_nid) { | 2060 | if (spec->dig_in_nid) { |
2028 | err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); | 2061 | err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); |
@@ -2030,8 +2063,24 @@ static int alc_build_controls(struct hda_codec *codec) | |||
2030 | return err; | 2063 | return err; |
2031 | } | 2064 | } |
2032 | 2065 | ||
2066 | /* create beep controls if needed */ | ||
2067 | if (spec->beep_amp) { | ||
2068 | struct snd_kcontrol_new *knew; | ||
2069 | for (knew = alc_beep_mixer; knew->name; knew++) { | ||
2070 | struct snd_kcontrol *kctl; | ||
2071 | kctl = snd_ctl_new1(knew, codec); | ||
2072 | if (!kctl) | ||
2073 | return -ENOMEM; | ||
2074 | kctl->private_value = spec->beep_amp; | ||
2075 | err = snd_hda_ctl_add(codec, kctl); | ||
2076 | if (err < 0) | ||
2077 | return err; | ||
2078 | } | ||
2079 | } | ||
2080 | |||
2033 | /* if we have no master control, let's create it */ | 2081 | /* if we have no master control, let's create it */ |
2034 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | 2082 | if (!spec->no_analog && |
2083 | !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | ||
2035 | unsigned int vmaster_tlv[4]; | 2084 | unsigned int vmaster_tlv[4]; |
2036 | snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, | 2085 | snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, |
2037 | HDA_OUTPUT, vmaster_tlv); | 2086 | HDA_OUTPUT, vmaster_tlv); |
@@ -2040,7 +2089,8 @@ static int alc_build_controls(struct hda_codec *codec) | |||
2040 | if (err < 0) | 2089 | if (err < 0) |
2041 | return err; | 2090 | return err; |
2042 | } | 2091 | } |
2043 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { | 2092 | if (!spec->no_analog && |
2093 | !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { | ||
2044 | err = snd_hda_add_vmaster(codec, "Master Playback Switch", | 2094 | err = snd_hda_add_vmaster(codec, "Master Playback Switch", |
2045 | NULL, alc_slave_sws); | 2095 | NULL, alc_slave_sws); |
2046 | if (err < 0) | 2096 | if (err < 0) |
@@ -2949,6 +2999,14 @@ static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
2949 | stream_tag, format, substream); | 2999 | stream_tag, format, substream); |
2950 | } | 3000 | } |
2951 | 3001 | ||
3002 | static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
3003 | struct hda_codec *codec, | ||
3004 | struct snd_pcm_substream *substream) | ||
3005 | { | ||
3006 | struct alc_spec *spec = codec->spec; | ||
3007 | return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); | ||
3008 | } | ||
3009 | |||
2952 | static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo, | 3010 | static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo, |
2953 | struct hda_codec *codec, | 3011 | struct hda_codec *codec, |
2954 | struct snd_pcm_substream *substream) | 3012 | struct snd_pcm_substream *substream) |
@@ -3032,7 +3090,8 @@ static struct hda_pcm_stream alc880_pcm_digital_playback = { | |||
3032 | .ops = { | 3090 | .ops = { |
3033 | .open = alc880_dig_playback_pcm_open, | 3091 | .open = alc880_dig_playback_pcm_open, |
3034 | .close = alc880_dig_playback_pcm_close, | 3092 | .close = alc880_dig_playback_pcm_close, |
3035 | .prepare = alc880_dig_playback_pcm_prepare | 3093 | .prepare = alc880_dig_playback_pcm_prepare, |
3094 | .cleanup = alc880_dig_playback_pcm_cleanup | ||
3036 | }, | 3095 | }, |
3037 | }; | 3096 | }; |
3038 | 3097 | ||
@@ -3059,6 +3118,9 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
3059 | codec->num_pcms = 1; | 3118 | codec->num_pcms = 1; |
3060 | codec->pcm_info = info; | 3119 | codec->pcm_info = info; |
3061 | 3120 | ||
3121 | if (spec->no_analog) | ||
3122 | goto skip_analog; | ||
3123 | |||
3062 | info->name = spec->stream_name_analog; | 3124 | info->name = spec->stream_name_analog; |
3063 | if (spec->stream_analog_playback) { | 3125 | if (spec->stream_analog_playback) { |
3064 | if (snd_BUG_ON(!spec->multiout.dac_nids)) | 3126 | if (snd_BUG_ON(!spec->multiout.dac_nids)) |
@@ -3082,12 +3144,17 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
3082 | } | 3144 | } |
3083 | } | 3145 | } |
3084 | 3146 | ||
3147 | skip_analog: | ||
3085 | /* SPDIF for stream index #1 */ | 3148 | /* SPDIF for stream index #1 */ |
3086 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { | 3149 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { |
3087 | codec->num_pcms = 2; | 3150 | codec->num_pcms = 2; |
3151 | codec->slave_dig_outs = spec->multiout.slave_dig_outs; | ||
3088 | info = spec->pcm_rec + 1; | 3152 | info = spec->pcm_rec + 1; |
3089 | info->name = spec->stream_name_digital; | 3153 | info->name = spec->stream_name_digital; |
3090 | info->pcm_type = HDA_PCM_TYPE_SPDIF; | 3154 | if (spec->dig_out_type) |
3155 | info->pcm_type = spec->dig_out_type; | ||
3156 | else | ||
3157 | info->pcm_type = HDA_PCM_TYPE_SPDIF; | ||
3091 | if (spec->multiout.dig_out_nid && | 3158 | if (spec->multiout.dig_out_nid && |
3092 | spec->stream_digital_playback) { | 3159 | spec->stream_digital_playback) { |
3093 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback); | 3160 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback); |
@@ -3102,6 +3169,9 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
3102 | codec->spdif_status_reset = 1; | 3169 | codec->spdif_status_reset = 1; |
3103 | } | 3170 | } |
3104 | 3171 | ||
3172 | if (spec->no_analog) | ||
3173 | return 0; | ||
3174 | |||
3105 | /* If the use of more than one ADC is requested for the current | 3175 | /* If the use of more than one ADC is requested for the current |
3106 | * model, configure a second analog capture-only PCM. | 3176 | * model, configure a second analog capture-only PCM. |
3107 | */ | 3177 | */ |
@@ -3160,65 +3230,17 @@ static void alc_free(struct hda_codec *codec) | |||
3160 | 3230 | ||
3161 | alc_free_kctls(codec); | 3231 | alc_free_kctls(codec); |
3162 | kfree(spec); | 3232 | kfree(spec); |
3163 | codec->spec = NULL; /* to be sure */ | 3233 | snd_hda_detach_beep_device(codec); |
3164 | } | 3234 | } |
3165 | 3235 | ||
3166 | #ifdef SND_HDA_NEEDS_RESUME | 3236 | #ifdef SND_HDA_NEEDS_RESUME |
3167 | static void store_pin_configs(struct hda_codec *codec) | ||
3168 | { | ||
3169 | struct alc_spec *spec = codec->spec; | ||
3170 | hda_nid_t nid, end_nid; | ||
3171 | |||
3172 | end_nid = codec->start_nid + codec->num_nodes; | ||
3173 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
3174 | unsigned int wid_caps = get_wcaps(codec, nid); | ||
3175 | unsigned int wid_type = | ||
3176 | (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | ||
3177 | if (wid_type != AC_WID_PIN) | ||
3178 | continue; | ||
3179 | if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids)) | ||
3180 | break; | ||
3181 | spec->pin_nids[spec->num_pins] = nid; | ||
3182 | spec->pin_cfgs[spec->num_pins] = | ||
3183 | snd_hda_codec_read(codec, nid, 0, | ||
3184 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3185 | spec->num_pins++; | ||
3186 | } | ||
3187 | } | ||
3188 | |||
3189 | static void resume_pin_configs(struct hda_codec *codec) | ||
3190 | { | ||
3191 | struct alc_spec *spec = codec->spec; | ||
3192 | int i; | ||
3193 | |||
3194 | for (i = 0; i < spec->num_pins; i++) { | ||
3195 | hda_nid_t pin_nid = spec->pin_nids[i]; | ||
3196 | unsigned int pin_config = spec->pin_cfgs[i]; | ||
3197 | snd_hda_codec_write(codec, pin_nid, 0, | ||
3198 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_0, | ||
3199 | pin_config & 0x000000ff); | ||
3200 | snd_hda_codec_write(codec, pin_nid, 0, | ||
3201 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, | ||
3202 | (pin_config & 0x0000ff00) >> 8); | ||
3203 | snd_hda_codec_write(codec, pin_nid, 0, | ||
3204 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, | ||
3205 | (pin_config & 0x00ff0000) >> 16); | ||
3206 | snd_hda_codec_write(codec, pin_nid, 0, | ||
3207 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, | ||
3208 | pin_config >> 24); | ||
3209 | } | ||
3210 | } | ||
3211 | |||
3212 | static int alc_resume(struct hda_codec *codec) | 3237 | static int alc_resume(struct hda_codec *codec) |
3213 | { | 3238 | { |
3214 | resume_pin_configs(codec); | ||
3215 | codec->patch_ops.init(codec); | 3239 | codec->patch_ops.init(codec); |
3216 | snd_hda_codec_resume_amp(codec); | 3240 | snd_hda_codec_resume_amp(codec); |
3217 | snd_hda_codec_resume_cache(codec); | 3241 | snd_hda_codec_resume_cache(codec); |
3218 | return 0; | 3242 | return 0; |
3219 | } | 3243 | } |
3220 | #else | ||
3221 | #define store_pin_configs(codec) | ||
3222 | #endif | 3244 | #endif |
3223 | 3245 | ||
3224 | /* | 3246 | /* |
@@ -3557,7 +3579,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { | |||
3557 | SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG), | 3579 | SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG), |
3558 | SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST), | 3580 | SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST), |
3559 | SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST), | 3581 | SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST), |
3560 | SND_PCI_QUIRK(0x1043, 0, "ASUS", ALC880_ASUS), /* default ASUS */ | 3582 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */ |
3561 | SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST), | 3583 | SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST), |
3562 | SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST), | 3584 | SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST), |
3563 | SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST), | 3585 | SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST), |
@@ -3600,7 +3622,8 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { | |||
3600 | SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG), | 3622 | SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG), |
3601 | SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG), | 3623 | SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG), |
3602 | SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG), | 3624 | SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG), |
3603 | SND_PCI_QUIRK(0x8086, 0, "Intel mobo", ALC880_3ST), /* default Intel */ | 3625 | /* default Intel */ |
3626 | SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST), | ||
3604 | SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG), | 3627 | SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG), |
3605 | SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG), | 3628 | SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG), |
3606 | {} | 3629 | {} |
@@ -3780,7 +3803,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3780 | .input_mux = &alc880_capture_source, | 3803 | .input_mux = &alc880_capture_source, |
3781 | }, | 3804 | }, |
3782 | [ALC880_UNIWILL_DIG] = { | 3805 | [ALC880_UNIWILL_DIG] = { |
3783 | .mixers = { alc880_asus_mixer, alc880_pcbeep_mixer }, | 3806 | .mixers = { alc880_asus_mixer }, |
3784 | .init_verbs = { alc880_volume_init_verbs, | 3807 | .init_verbs = { alc880_volume_init_verbs, |
3785 | alc880_pin_asus_init_verbs }, | 3808 | alc880_pin_asus_init_verbs }, |
3786 | .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), | 3809 | .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), |
@@ -3818,8 +3841,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3818 | .init_hook = alc880_uniwill_p53_hp_automute, | 3841 | .init_hook = alc880_uniwill_p53_hp_automute, |
3819 | }, | 3842 | }, |
3820 | [ALC880_FUJITSU] = { | 3843 | [ALC880_FUJITSU] = { |
3821 | .mixers = { alc880_fujitsu_mixer, | 3844 | .mixers = { alc880_fujitsu_mixer }, |
3822 | alc880_pcbeep_mixer, }, | ||
3823 | .init_verbs = { alc880_volume_init_verbs, | 3845 | .init_verbs = { alc880_volume_init_verbs, |
3824 | alc880_uniwill_p53_init_verbs, | 3846 | alc880_uniwill_p53_init_verbs, |
3825 | alc880_beep_init_verbs }, | 3847 | alc880_beep_init_verbs }, |
@@ -4112,7 +4134,7 @@ static int new_analog_input(struct alc_spec *spec, hda_nid_t pin, | |||
4112 | static int alc880_auto_create_analog_input_ctls(struct alc_spec *spec, | 4134 | static int alc880_auto_create_analog_input_ctls(struct alc_spec *spec, |
4113 | const struct auto_pin_cfg *cfg) | 4135 | const struct auto_pin_cfg *cfg) |
4114 | { | 4136 | { |
4115 | struct hda_input_mux *imux = &spec->private_imux; | 4137 | struct hda_input_mux *imux = &spec->private_imux[0]; |
4116 | int i, err, idx; | 4138 | int i, err, idx; |
4117 | 4139 | ||
4118 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 4140 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
@@ -4200,11 +4222,9 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec) | |||
4200 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 4222 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
4201 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 4223 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
4202 | if (alc880_is_input_pin(nid)) { | 4224 | if (alc880_is_input_pin(nid)) { |
4203 | snd_hda_codec_write(codec, nid, 0, | 4225 | alc_set_input_pin(codec, nid, i); |
4204 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 4226 | if (nid != ALC880_PIN_CD_NID && |
4205 | i <= AUTO_PIN_FRONT_MIC ? | 4227 | (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) |
4206 | PIN_VREF80 : PIN_IN); | ||
4207 | if (nid != ALC880_PIN_CD_NID) | ||
4208 | snd_hda_codec_write(codec, nid, 0, | 4228 | snd_hda_codec_write(codec, nid, 0, |
4209 | AC_VERB_SET_AMP_GAIN_MUTE, | 4229 | AC_VERB_SET_AMP_GAIN_MUTE, |
4210 | AMP_OUT_MUTE); | 4230 | AMP_OUT_MUTE); |
@@ -4219,7 +4239,7 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec) | |||
4219 | static int alc880_parse_auto_config(struct hda_codec *codec) | 4239 | static int alc880_parse_auto_config(struct hda_codec *codec) |
4220 | { | 4240 | { |
4221 | struct alc_spec *spec = codec->spec; | 4241 | struct alc_spec *spec = codec->spec; |
4222 | int err; | 4242 | int i, err; |
4223 | static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; | 4243 | static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; |
4224 | 4244 | ||
4225 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, | 4245 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, |
@@ -4250,8 +4270,23 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
4250 | 4270 | ||
4251 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 4271 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
4252 | 4272 | ||
4253 | if (spec->autocfg.dig_out_pin) | 4273 | /* check multiple SPDIF-out (for recent codecs) */ |
4254 | spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; | 4274 | for (i = 0; i < spec->autocfg.dig_outs; i++) { |
4275 | hda_nid_t dig_nid; | ||
4276 | err = snd_hda_get_connections(codec, | ||
4277 | spec->autocfg.dig_out_pins[i], | ||
4278 | &dig_nid, 1); | ||
4279 | if (err < 0) | ||
4280 | continue; | ||
4281 | if (!i) | ||
4282 | spec->multiout.dig_out_nid = dig_nid; | ||
4283 | else { | ||
4284 | spec->multiout.slave_dig_outs = spec->slave_dig_outs; | ||
4285 | spec->slave_dig_outs[i - 1] = dig_nid; | ||
4286 | if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1) | ||
4287 | break; | ||
4288 | } | ||
4289 | } | ||
4255 | if (spec->autocfg.dig_in_pin) | 4290 | if (spec->autocfg.dig_in_pin) |
4256 | spec->dig_in_nid = ALC880_DIGIN_NID; | 4291 | spec->dig_in_nid = ALC880_DIGIN_NID; |
4257 | 4292 | ||
@@ -4261,9 +4296,8 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
4261 | add_verb(spec, alc880_volume_init_verbs); | 4296 | add_verb(spec, alc880_volume_init_verbs); |
4262 | 4297 | ||
4263 | spec->num_mux_defs = 1; | 4298 | spec->num_mux_defs = 1; |
4264 | spec->input_mux = &spec->private_imux; | 4299 | spec->input_mux = &spec->private_imux[0]; |
4265 | 4300 | ||
4266 | store_pin_configs(codec); | ||
4267 | return 1; | 4301 | return 1; |
4268 | } | 4302 | } |
4269 | 4303 | ||
@@ -4278,21 +4312,33 @@ static void alc880_auto_init(struct hda_codec *codec) | |||
4278 | alc_inithook(codec); | 4312 | alc_inithook(codec); |
4279 | } | 4313 | } |
4280 | 4314 | ||
4281 | /* | ||
4282 | * OK, here we have finally the patch for ALC880 | ||
4283 | */ | ||
4284 | |||
4285 | static void set_capture_mixer(struct alc_spec *spec) | 4315 | static void set_capture_mixer(struct alc_spec *spec) |
4286 | { | 4316 | { |
4287 | static struct snd_kcontrol_new *caps[3] = { | 4317 | static struct snd_kcontrol_new *caps[2][3] = { |
4288 | alc_capture_mixer1, | 4318 | { alc_capture_mixer_nosrc1, |
4289 | alc_capture_mixer2, | 4319 | alc_capture_mixer_nosrc2, |
4290 | alc_capture_mixer3, | 4320 | alc_capture_mixer_nosrc3 }, |
4321 | { alc_capture_mixer1, | ||
4322 | alc_capture_mixer2, | ||
4323 | alc_capture_mixer3 }, | ||
4291 | }; | 4324 | }; |
4292 | if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) | 4325 | if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { |
4293 | spec->cap_mixer = caps[spec->num_adc_nids - 1]; | 4326 | int mux; |
4327 | if (spec->input_mux && spec->input_mux->num_items > 1) | ||
4328 | mux = 1; | ||
4329 | else | ||
4330 | mux = 0; | ||
4331 | spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; | ||
4332 | } | ||
4294 | } | 4333 | } |
4295 | 4334 | ||
4335 | #define set_beep_amp(spec, nid, idx, dir) \ | ||
4336 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) | ||
4337 | |||
4338 | /* | ||
4339 | * OK, here we have finally the patch for ALC880 | ||
4340 | */ | ||
4341 | |||
4296 | static int patch_alc880(struct hda_codec *codec) | 4342 | static int patch_alc880(struct hda_codec *codec) |
4297 | { | 4343 | { |
4298 | struct alc_spec *spec; | 4344 | struct alc_spec *spec; |
@@ -4328,6 +4374,12 @@ static int patch_alc880(struct hda_codec *codec) | |||
4328 | } | 4374 | } |
4329 | } | 4375 | } |
4330 | 4376 | ||
4377 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
4378 | if (err < 0) { | ||
4379 | alc_free(codec); | ||
4380 | return err; | ||
4381 | } | ||
4382 | |||
4331 | if (board_config != ALC880_AUTO) | 4383 | if (board_config != ALC880_AUTO) |
4332 | setup_preset(spec, &alc880_presets[board_config]); | 4384 | setup_preset(spec, &alc880_presets[board_config]); |
4333 | 4385 | ||
@@ -4354,6 +4406,7 @@ static int patch_alc880(struct hda_codec *codec) | |||
4354 | } | 4406 | } |
4355 | } | 4407 | } |
4356 | set_capture_mixer(spec); | 4408 | set_capture_mixer(spec); |
4409 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
4357 | 4410 | ||
4358 | spec->vmaster_nid = 0x0c; | 4411 | spec->vmaster_nid = 0x0c; |
4359 | 4412 | ||
@@ -4461,6 +4514,26 @@ static struct hda_input_mux alc260_acer_capture_sources[2] = { | |||
4461 | }, | 4514 | }, |
4462 | }, | 4515 | }, |
4463 | }; | 4516 | }; |
4517 | |||
4518 | /* Maxdata Favorit 100XS */ | ||
4519 | static struct hda_input_mux alc260_favorit100_capture_sources[2] = { | ||
4520 | { | ||
4521 | .num_items = 2, | ||
4522 | .items = { | ||
4523 | { "Line/Mic", 0x0 }, | ||
4524 | { "CD", 0x4 }, | ||
4525 | }, | ||
4526 | }, | ||
4527 | { | ||
4528 | .num_items = 3, | ||
4529 | .items = { | ||
4530 | { "Line/Mic", 0x0 }, | ||
4531 | { "CD", 0x4 }, | ||
4532 | { "Mixer", 0x5 }, | ||
4533 | }, | ||
4534 | }, | ||
4535 | }; | ||
4536 | |||
4464 | /* | 4537 | /* |
4465 | * This is just place-holder, so there's something for alc_build_pcms to look | 4538 | * This is just place-holder, so there's something for alc_build_pcms to look |
4466 | * at when it calculates the maximum number of channels. ALC260 has no mixer | 4539 | * at when it calculates the maximum number of channels. ALC260 has no mixer |
@@ -4503,12 +4576,6 @@ static struct snd_kcontrol_new alc260_input_mixer[] = { | |||
4503 | { } /* end */ | 4576 | { } /* end */ |
4504 | }; | 4577 | }; |
4505 | 4578 | ||
4506 | static struct snd_kcontrol_new alc260_pc_beep_mixer[] = { | ||
4507 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
4508 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
4509 | { } /* end */ | ||
4510 | }; | ||
4511 | |||
4512 | /* update HP, line and mono out pins according to the master switch */ | 4579 | /* update HP, line and mono out pins according to the master switch */ |
4513 | static void alc260_hp_master_update(struct hda_codec *codec, | 4580 | static void alc260_hp_master_update(struct hda_codec *codec, |
4514 | hda_nid_t hp, hda_nid_t line, | 4581 | hda_nid_t hp, hda_nid_t line, |
@@ -4700,8 +4767,6 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | |||
4700 | HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), | 4767 | HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), |
4701 | HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), | 4768 | HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), |
4702 | ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), | 4769 | ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), |
4703 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
4704 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
4705 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), | 4770 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), |
4706 | HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT), | 4771 | HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT), |
4707 | { } /* end */ | 4772 | { } /* end */ |
@@ -4746,8 +4811,18 @@ static struct snd_kcontrol_new alc260_acer_mixer[] = { | |||
4746 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), | 4811 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), |
4747 | HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), | 4812 | HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), |
4748 | ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), | 4813 | ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), |
4749 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | 4814 | { } /* end */ |
4750 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | 4815 | }; |
4816 | |||
4817 | /* Maxdata Favorit 100XS: one output and one input (0x12) jack | ||
4818 | */ | ||
4819 | static struct snd_kcontrol_new alc260_favorit100_mixer[] = { | ||
4820 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), | ||
4821 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), | ||
4822 | ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), | ||
4823 | HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT), | ||
4824 | HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT), | ||
4825 | ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), | ||
4751 | { } /* end */ | 4826 | { } /* end */ |
4752 | }; | 4827 | }; |
4753 | 4828 | ||
@@ -4765,8 +4840,6 @@ static struct snd_kcontrol_new alc260_will_mixer[] = { | |||
4765 | ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), | 4840 | ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), |
4766 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 4841 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
4767 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 4842 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
4768 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
4769 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
4770 | { } /* end */ | 4843 | { } /* end */ |
4771 | }; | 4844 | }; |
4772 | 4845 | ||
@@ -5124,6 +5197,89 @@ static struct hda_verb alc260_acer_init_verbs[] = { | |||
5124 | { } | 5197 | { } |
5125 | }; | 5198 | }; |
5126 | 5199 | ||
5200 | /* Initialisation sequence for Maxdata Favorit 100XS | ||
5201 | * (adapted from Acer init verbs). | ||
5202 | */ | ||
5203 | static struct hda_verb alc260_favorit100_init_verbs[] = { | ||
5204 | /* GPIO 0 enables the output jack. | ||
5205 | * Turn this on and rely on the standard mute | ||
5206 | * methods whenever the user wants to turn these outputs off. | ||
5207 | */ | ||
5208 | {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, | ||
5209 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | ||
5210 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | ||
5211 | /* Line/Mic input jack is connected to Mic1 pin */ | ||
5212 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, | ||
5213 | /* Ensure all other unused pins are disabled and muted. */ | ||
5214 | {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
5215 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5216 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
5217 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5218 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
5219 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5220 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
5221 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5222 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
5223 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5224 | /* Disable digital (SPDIF) pins */ | ||
5225 | {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
5226 | {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
5227 | |||
5228 | /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum | ||
5229 | * bus when acting as outputs. | ||
5230 | */ | ||
5231 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, | ||
5232 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, | ||
5233 | |||
5234 | /* Start with output sum widgets muted and their output gains at min */ | ||
5235 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5236 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
5237 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
5238 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5239 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
5240 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
5241 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5242 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
5243 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
5244 | |||
5245 | /* Unmute Line-out pin widget amp left and right | ||
5246 | * (no equiv mixer ctrl) | ||
5247 | */ | ||
5248 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
5249 | /* Unmute Mic1 and Line1 pin widget input buffers since they start as | ||
5250 | * inputs. If the pin mode is changed by the user the pin mode control | ||
5251 | * will take care of enabling the pin's input/output buffers as needed. | ||
5252 | * Therefore there's no need to enable the input buffer at this | ||
5253 | * stage. | ||
5254 | */ | ||
5255 | {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
5256 | |||
5257 | /* Mute capture amp left and right */ | ||
5258 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5259 | /* Set ADC connection select to match default mixer setting - mic | ||
5260 | * (on mic1 pin) | ||
5261 | */ | ||
5262 | {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
5263 | |||
5264 | /* Do similar with the second ADC: mute capture input amp and | ||
5265 | * set ADC connection to mic to match ALSA's default state. | ||
5266 | */ | ||
5267 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
5268 | {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
5269 | |||
5270 | /* Mute all inputs to mixer widget (even unconnected ones) */ | ||
5271 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ | ||
5272 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ | ||
5273 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ | ||
5274 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ | ||
5275 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ | ||
5276 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ | ||
5277 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ | ||
5278 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ | ||
5279 | |||
5280 | { } | ||
5281 | }; | ||
5282 | |||
5127 | static struct hda_verb alc260_will_verbs[] = { | 5283 | static struct hda_verb alc260_will_verbs[] = { |
5128 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 5284 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
5129 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, | 5285 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, |
@@ -5270,8 +5426,6 @@ static struct snd_kcontrol_new alc260_test_mixer[] = { | |||
5270 | HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT), | 5426 | HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT), |
5271 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 5427 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
5272 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 5428 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
5273 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
5274 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
5275 | HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT), | 5429 | HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT), |
5276 | HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT), | 5430 | HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT), |
5277 | HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT), | 5431 | HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT), |
@@ -5469,7 +5623,7 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, | |||
5469 | static int alc260_auto_create_analog_input_ctls(struct alc_spec *spec, | 5623 | static int alc260_auto_create_analog_input_ctls(struct alc_spec *spec, |
5470 | const struct auto_pin_cfg *cfg) | 5624 | const struct auto_pin_cfg *cfg) |
5471 | { | 5625 | { |
5472 | struct hda_input_mux *imux = &spec->private_imux; | 5626 | struct hda_input_mux *imux = &spec->private_imux[0]; |
5473 | int i, err, idx; | 5627 | int i, err, idx; |
5474 | 5628 | ||
5475 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 5629 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
@@ -5544,11 +5698,9 @@ static void alc260_auto_init_analog_input(struct hda_codec *codec) | |||
5544 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 5698 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
5545 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 5699 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
5546 | if (nid >= 0x12) { | 5700 | if (nid >= 0x12) { |
5547 | snd_hda_codec_write(codec, nid, 0, | 5701 | alc_set_input_pin(codec, nid, i); |
5548 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 5702 | if (nid != ALC260_PIN_CD_NID && |
5549 | i <= AUTO_PIN_FRONT_MIC ? | 5703 | (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) |
5550 | PIN_VREF80 : PIN_IN); | ||
5551 | if (nid != ALC260_PIN_CD_NID) | ||
5552 | snd_hda_codec_write(codec, nid, 0, | 5704 | snd_hda_codec_write(codec, nid, 0, |
5553 | AC_VERB_SET_AMP_GAIN_MUTE, | 5705 | AC_VERB_SET_AMP_GAIN_MUTE, |
5554 | AMP_OUT_MUTE); | 5706 | AMP_OUT_MUTE); |
@@ -5621,7 +5773,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
5621 | 5773 | ||
5622 | spec->multiout.max_channels = 2; | 5774 | spec->multiout.max_channels = 2; |
5623 | 5775 | ||
5624 | if (spec->autocfg.dig_out_pin) | 5776 | if (spec->autocfg.dig_outs) |
5625 | spec->multiout.dig_out_nid = ALC260_DIGOUT_NID; | 5777 | spec->multiout.dig_out_nid = ALC260_DIGOUT_NID; |
5626 | if (spec->kctls.list) | 5778 | if (spec->kctls.list) |
5627 | add_mixer(spec, spec->kctls.list); | 5779 | add_mixer(spec, spec->kctls.list); |
@@ -5629,9 +5781,8 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
5629 | add_verb(spec, alc260_volume_init_verbs); | 5781 | add_verb(spec, alc260_volume_init_verbs); |
5630 | 5782 | ||
5631 | spec->num_mux_defs = 1; | 5783 | spec->num_mux_defs = 1; |
5632 | spec->input_mux = &spec->private_imux; | 5784 | spec->input_mux = &spec->private_imux[0]; |
5633 | 5785 | ||
5634 | store_pin_configs(codec); | ||
5635 | return 1; | 5786 | return 1; |
5636 | } | 5787 | } |
5637 | 5788 | ||
@@ -5668,6 +5819,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = { | |||
5668 | [ALC260_ACER] = "acer", | 5819 | [ALC260_ACER] = "acer", |
5669 | [ALC260_WILL] = "will", | 5820 | [ALC260_WILL] = "will", |
5670 | [ALC260_REPLACER_672V] = "replacer", | 5821 | [ALC260_REPLACER_672V] = "replacer", |
5822 | [ALC260_FAVORIT100] = "favorit100", | ||
5671 | #ifdef CONFIG_SND_DEBUG | 5823 | #ifdef CONFIG_SND_DEBUG |
5672 | [ALC260_TEST] = "test", | 5824 | [ALC260_TEST] = "test", |
5673 | #endif | 5825 | #endif |
@@ -5677,6 +5829,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = { | |||
5677 | static struct snd_pci_quirk alc260_cfg_tbl[] = { | 5829 | static struct snd_pci_quirk alc260_cfg_tbl[] = { |
5678 | SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), | 5830 | SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), |
5679 | SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), | 5831 | SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), |
5832 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100), | ||
5680 | SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013), | 5833 | SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013), |
5681 | SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013), | 5834 | SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013), |
5682 | SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013), | 5835 | SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013), |
@@ -5699,8 +5852,7 @@ static struct snd_pci_quirk alc260_cfg_tbl[] = { | |||
5699 | static struct alc_config_preset alc260_presets[] = { | 5852 | static struct alc_config_preset alc260_presets[] = { |
5700 | [ALC260_BASIC] = { | 5853 | [ALC260_BASIC] = { |
5701 | .mixers = { alc260_base_output_mixer, | 5854 | .mixers = { alc260_base_output_mixer, |
5702 | alc260_input_mixer, | 5855 | alc260_input_mixer }, |
5703 | alc260_pc_beep_mixer }, | ||
5704 | .init_verbs = { alc260_init_verbs }, | 5856 | .init_verbs = { alc260_init_verbs }, |
5705 | .num_dacs = ARRAY_SIZE(alc260_dac_nids), | 5857 | .num_dacs = ARRAY_SIZE(alc260_dac_nids), |
5706 | .dac_nids = alc260_dac_nids, | 5858 | .dac_nids = alc260_dac_nids, |
@@ -5779,6 +5931,18 @@ static struct alc_config_preset alc260_presets[] = { | |||
5779 | .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), | 5931 | .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), |
5780 | .input_mux = alc260_acer_capture_sources, | 5932 | .input_mux = alc260_acer_capture_sources, |
5781 | }, | 5933 | }, |
5934 | [ALC260_FAVORIT100] = { | ||
5935 | .mixers = { alc260_favorit100_mixer }, | ||
5936 | .init_verbs = { alc260_favorit100_init_verbs }, | ||
5937 | .num_dacs = ARRAY_SIZE(alc260_dac_nids), | ||
5938 | .dac_nids = alc260_dac_nids, | ||
5939 | .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), | ||
5940 | .adc_nids = alc260_dual_adc_nids, | ||
5941 | .num_channel_mode = ARRAY_SIZE(alc260_modes), | ||
5942 | .channel_mode = alc260_modes, | ||
5943 | .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources), | ||
5944 | .input_mux = alc260_favorit100_capture_sources, | ||
5945 | }, | ||
5782 | [ALC260_WILL] = { | 5946 | [ALC260_WILL] = { |
5783 | .mixers = { alc260_will_mixer }, | 5947 | .mixers = { alc260_will_mixer }, |
5784 | .init_verbs = { alc260_init_verbs, alc260_will_verbs }, | 5948 | .init_verbs = { alc260_init_verbs, alc260_will_verbs }, |
@@ -5855,6 +6019,12 @@ static int patch_alc260(struct hda_codec *codec) | |||
5855 | } | 6019 | } |
5856 | } | 6020 | } |
5857 | 6021 | ||
6022 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
6023 | if (err < 0) { | ||
6024 | alc_free(codec); | ||
6025 | return err; | ||
6026 | } | ||
6027 | |||
5858 | if (board_config != ALC260_AUTO) | 6028 | if (board_config != ALC260_AUTO) |
5859 | setup_preset(spec, &alc260_presets[board_config]); | 6029 | setup_preset(spec, &alc260_presets[board_config]); |
5860 | 6030 | ||
@@ -5880,6 +6050,7 @@ static int patch_alc260(struct hda_codec *codec) | |||
5880 | } | 6050 | } |
5881 | } | 6051 | } |
5882 | set_capture_mixer(spec); | 6052 | set_capture_mixer(spec); |
6053 | set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); | ||
5883 | 6054 | ||
5884 | spec->vmaster_nid = 0x08; | 6055 | spec->vmaster_nid = 0x08; |
5885 | 6056 | ||
@@ -6051,8 +6222,6 @@ static struct snd_kcontrol_new alc882_base_mixer[] = { | |||
6051 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 6222 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
6052 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 6223 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
6053 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 6224 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
6054 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
6055 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
6056 | { } /* end */ | 6225 | { } /* end */ |
6057 | }; | 6226 | }; |
6058 | 6227 | ||
@@ -6079,8 +6248,6 @@ static struct snd_kcontrol_new alc882_w2jc_mixer[] = { | |||
6079 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 6248 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
6080 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 6249 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
6081 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 6250 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
6082 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
6083 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
6084 | { } /* end */ | 6251 | { } /* end */ |
6085 | }; | 6252 | }; |
6086 | 6253 | ||
@@ -6132,8 +6299,6 @@ static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { | |||
6132 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 6299 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
6133 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 6300 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
6134 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 6301 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
6135 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
6136 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
6137 | { } /* end */ | 6302 | { } /* end */ |
6138 | }; | 6303 | }; |
6139 | 6304 | ||
@@ -6242,8 +6407,10 @@ static struct snd_kcontrol_new alc882_macpro_mixer[] = { | |||
6242 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), | 6407 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), |
6243 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), | 6408 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), |
6244 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), | 6409 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), |
6410 | /* FIXME: this looks suspicious... | ||
6245 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT), | 6411 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT), |
6246 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT), | 6412 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT), |
6413 | */ | ||
6247 | { } /* end */ | 6414 | { } /* end */ |
6248 | }; | 6415 | }; |
6249 | 6416 | ||
@@ -6875,19 +7042,9 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec) | |||
6875 | 7042 | ||
6876 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 7043 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
6877 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 7044 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
6878 | unsigned int vref; | ||
6879 | if (!nid) | 7045 | if (!nid) |
6880 | continue; | 7046 | continue; |
6881 | vref = PIN_IN; | 7047 | alc_set_input_pin(codec, nid, AUTO_PIN_FRONT_MIC /*i*/); |
6882 | if (1 /*i <= AUTO_PIN_FRONT_MIC*/) { | ||
6883 | unsigned int pincap; | ||
6884 | pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | ||
6885 | if ((pincap >> AC_PINCAP_VREF_SHIFT) & | ||
6886 | AC_PINCAP_VREF_80) | ||
6887 | vref = PIN_VREF80; | ||
6888 | } | ||
6889 | snd_hda_codec_write(codec, nid, 0, | ||
6890 | AC_VERB_SET_PIN_WIDGET_CONTROL, vref); | ||
6891 | if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) | 7048 | if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) |
6892 | snd_hda_codec_write(codec, nid, 0, | 7049 | snd_hda_codec_write(codec, nid, 0, |
6893 | AC_VERB_SET_AMP_GAIN_MUTE, | 7050 | AC_VERB_SET_AMP_GAIN_MUTE, |
@@ -6898,18 +7055,21 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec) | |||
6898 | static void alc882_auto_init_input_src(struct hda_codec *codec) | 7055 | static void alc882_auto_init_input_src(struct hda_codec *codec) |
6899 | { | 7056 | { |
6900 | struct alc_spec *spec = codec->spec; | 7057 | struct alc_spec *spec = codec->spec; |
6901 | const struct hda_input_mux *imux = spec->input_mux; | ||
6902 | int c; | 7058 | int c; |
6903 | 7059 | ||
6904 | for (c = 0; c < spec->num_adc_nids; c++) { | 7060 | for (c = 0; c < spec->num_adc_nids; c++) { |
6905 | hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; | 7061 | hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; |
6906 | hda_nid_t nid = spec->capsrc_nids[c]; | 7062 | hda_nid_t nid = spec->capsrc_nids[c]; |
7063 | unsigned int mux_idx; | ||
7064 | const struct hda_input_mux *imux; | ||
6907 | int conns, mute, idx, item; | 7065 | int conns, mute, idx, item; |
6908 | 7066 | ||
6909 | conns = snd_hda_get_connections(codec, nid, conn_list, | 7067 | conns = snd_hda_get_connections(codec, nid, conn_list, |
6910 | ARRAY_SIZE(conn_list)); | 7068 | ARRAY_SIZE(conn_list)); |
6911 | if (conns < 0) | 7069 | if (conns < 0) |
6912 | continue; | 7070 | continue; |
7071 | mux_idx = c >= spec->num_mux_defs ? 0 : c; | ||
7072 | imux = &spec->input_mux[mux_idx]; | ||
6913 | for (idx = 0; idx < conns; idx++) { | 7073 | for (idx = 0; idx < conns; idx++) { |
6914 | /* if the current connection is the selected one, | 7074 | /* if the current connection is the selected one, |
6915 | * unmute it as default - otherwise mute it | 7075 | * unmute it as default - otherwise mute it |
@@ -6922,8 +7082,20 @@ static void alc882_auto_init_input_src(struct hda_codec *codec) | |||
6922 | break; | 7082 | break; |
6923 | } | 7083 | } |
6924 | } | 7084 | } |
6925 | snd_hda_codec_write(codec, nid, 0, | 7085 | /* check if we have a selector or mixer |
6926 | AC_VERB_SET_AMP_GAIN_MUTE, mute); | 7086 | * we could check for the widget type instead, but |
7087 | * just check for Amp-In presence (in case of mixer | ||
7088 | * without amp-in there is something wrong, this | ||
7089 | * function shouldn't be used or capsrc nid is wrong) | ||
7090 | */ | ||
7091 | if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) | ||
7092 | snd_hda_codec_write(codec, nid, 0, | ||
7093 | AC_VERB_SET_AMP_GAIN_MUTE, | ||
7094 | mute); | ||
7095 | else if (mute != AMP_IN_MUTE(idx)) | ||
7096 | snd_hda_codec_write(codec, nid, 0, | ||
7097 | AC_VERB_SET_CONNECT_SEL, | ||
7098 | idx); | ||
6927 | } | 7099 | } |
6928 | } | 7100 | } |
6929 | } | 7101 | } |
@@ -7012,12 +7184,15 @@ static int patch_alc882(struct hda_codec *codec) | |||
7012 | break; | 7184 | break; |
7013 | case 0x106b1000: /* iMac 24 */ | 7185 | case 0x106b1000: /* iMac 24 */ |
7014 | case 0x106b2800: /* AppleTV */ | 7186 | case 0x106b2800: /* AppleTV */ |
7187 | case 0x106b3e00: /* iMac 24 Aluminium */ | ||
7015 | board_config = ALC885_IMAC24; | 7188 | board_config = ALC885_IMAC24; |
7016 | break; | 7189 | break; |
7190 | case 0x106b00a0: /* MacBookPro3,1 - Another revision */ | ||
7017 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ | 7191 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ |
7018 | case 0x106b00a4: /* MacbookPro4,1 */ | 7192 | case 0x106b00a4: /* MacbookPro4,1 */ |
7019 | case 0x106b2c00: /* Macbook Pro rev3 */ | 7193 | case 0x106b2c00: /* Macbook Pro rev3 */ |
7020 | case 0x106b3600: /* Macbook 3.1 */ | 7194 | case 0x106b3600: /* Macbook 3.1 */ |
7195 | case 0x106b3800: /* MacbookPro4,1 - latter revision */ | ||
7021 | board_config = ALC885_MBP3; | 7196 | board_config = ALC885_MBP3; |
7022 | break; | 7197 | break; |
7023 | default: | 7198 | default: |
@@ -7049,6 +7224,12 @@ static int patch_alc882(struct hda_codec *codec) | |||
7049 | } | 7224 | } |
7050 | } | 7225 | } |
7051 | 7226 | ||
7227 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
7228 | if (err < 0) { | ||
7229 | alc_free(codec); | ||
7230 | return err; | ||
7231 | } | ||
7232 | |||
7052 | if (board_config != ALC882_AUTO) | 7233 | if (board_config != ALC882_AUTO) |
7053 | setup_preset(spec, &alc882_presets[board_config]); | 7234 | setup_preset(spec, &alc882_presets[board_config]); |
7054 | 7235 | ||
@@ -7069,7 +7250,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
7069 | spec->stream_digital_playback = &alc882_pcm_digital_playback; | 7250 | spec->stream_digital_playback = &alc882_pcm_digital_playback; |
7070 | spec->stream_digital_capture = &alc882_pcm_digital_capture; | 7251 | spec->stream_digital_capture = &alc882_pcm_digital_capture; |
7071 | 7252 | ||
7072 | spec->is_mix_capture = 1; /* matrix-style capture */ | 7253 | spec->capture_style = CAPT_MIX; /* matrix-style capture */ |
7073 | if (!spec->adc_nids && spec->input_mux) { | 7254 | if (!spec->adc_nids && spec->input_mux) { |
7074 | /* check whether NID 0x07 is valid */ | 7255 | /* check whether NID 0x07 is valid */ |
7075 | unsigned int wcap = get_wcaps(codec, 0x07); | 7256 | unsigned int wcap = get_wcaps(codec, 0x07); |
@@ -7086,6 +7267,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
7086 | } | 7267 | } |
7087 | } | 7268 | } |
7088 | set_capture_mixer(spec); | 7269 | set_capture_mixer(spec); |
7270 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
7089 | 7271 | ||
7090 | spec->vmaster_nid = 0x0c; | 7272 | spec->vmaster_nid = 0x0c; |
7091 | 7273 | ||
@@ -7137,10 +7319,14 @@ static hda_nid_t alc883_adc_nids_rev[2] = { | |||
7137 | 0x09, 0x08 | 7319 | 0x09, 0x08 |
7138 | }; | 7320 | }; |
7139 | 7321 | ||
7322 | #define alc889_adc_nids alc880_adc_nids | ||
7323 | |||
7140 | static hda_nid_t alc883_capsrc_nids[2] = { 0x23, 0x22 }; | 7324 | static hda_nid_t alc883_capsrc_nids[2] = { 0x23, 0x22 }; |
7141 | 7325 | ||
7142 | static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; | 7326 | static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; |
7143 | 7327 | ||
7328 | #define alc889_capsrc_nids alc882_capsrc_nids | ||
7329 | |||
7144 | /* input MUX */ | 7330 | /* input MUX */ |
7145 | /* FIXME: should be a matrix-type input source selection */ | 7331 | /* FIXME: should be a matrix-type input source selection */ |
7146 | 7332 | ||
@@ -7358,8 +7544,6 @@ static struct snd_kcontrol_new alc883_base_mixer[] = { | |||
7358 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 7544 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
7359 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 7545 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
7360 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 7546 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
7361 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
7362 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
7363 | { } /* end */ | 7547 | { } /* end */ |
7364 | }; | 7548 | }; |
7365 | 7549 | ||
@@ -7422,8 +7606,6 @@ static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { | |||
7422 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 7606 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
7423 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 7607 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
7424 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 7608 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
7425 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
7426 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
7427 | { } /* end */ | 7609 | { } /* end */ |
7428 | }; | 7610 | }; |
7429 | 7611 | ||
@@ -7447,8 +7629,6 @@ static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { | |||
7447 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 7629 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
7448 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 7630 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
7449 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 7631 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
7450 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
7451 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
7452 | { } /* end */ | 7632 | { } /* end */ |
7453 | }; | 7633 | }; |
7454 | 7634 | ||
@@ -7473,8 +7653,6 @@ static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { | |||
7473 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 7653 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
7474 | HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), | 7654 | HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), |
7475 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 7655 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
7476 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
7477 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
7478 | { } /* end */ | 7656 | { } /* end */ |
7479 | }; | 7657 | }; |
7480 | 7658 | ||
@@ -7498,8 +7676,6 @@ static struct snd_kcontrol_new alc883_fivestack_mixer[] = { | |||
7498 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 7676 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
7499 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 7677 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
7500 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 7678 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
7501 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
7502 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
7503 | { } /* end */ | 7679 | { } /* end */ |
7504 | }; | 7680 | }; |
7505 | 7681 | ||
@@ -7907,36 +8083,83 @@ static struct hda_verb alc888_lenovo_sky_verbs[] = { | |||
7907 | { } /* end */ | 8083 | { } /* end */ |
7908 | }; | 8084 | }; |
7909 | 8085 | ||
8086 | static struct hda_verb alc888_6st_dell_verbs[] = { | ||
8087 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
8088 | { } | ||
8089 | }; | ||
8090 | |||
8091 | static void alc888_3st_hp_front_automute(struct hda_codec *codec) | ||
8092 | { | ||
8093 | unsigned int present, bits; | ||
8094 | |||
8095 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
8096 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
8097 | bits = present ? HDA_AMP_MUTE : 0; | ||
8098 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8099 | HDA_AMP_MUTE, bits); | ||
8100 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8101 | HDA_AMP_MUTE, bits); | ||
8102 | snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, | ||
8103 | HDA_AMP_MUTE, bits); | ||
8104 | } | ||
8105 | |||
8106 | static void alc888_3st_hp_unsol_event(struct hda_codec *codec, | ||
8107 | unsigned int res) | ||
8108 | { | ||
8109 | switch (res >> 26) { | ||
8110 | case ALC880_HP_EVENT: | ||
8111 | alc888_3st_hp_front_automute(codec); | ||
8112 | break; | ||
8113 | } | ||
8114 | } | ||
8115 | |||
7910 | static struct hda_verb alc888_3st_hp_verbs[] = { | 8116 | static struct hda_verb alc888_3st_hp_verbs[] = { |
7911 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ | 8117 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ |
7912 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ | 8118 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ |
7913 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ | 8119 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ |
7914 | { } | ||
7915 | }; | ||
7916 | |||
7917 | static struct hda_verb alc888_6st_dell_verbs[] = { | ||
7918 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 8120 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
7919 | { } | 8121 | { } /* end */ |
7920 | }; | 8122 | }; |
7921 | 8123 | ||
8124 | /* | ||
8125 | * 2ch mode | ||
8126 | */ | ||
7922 | static struct hda_verb alc888_3st_hp_2ch_init[] = { | 8127 | static struct hda_verb alc888_3st_hp_2ch_init[] = { |
7923 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, | 8128 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, |
7924 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | 8129 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, |
7925 | { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, | 8130 | { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, |
7926 | { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | 8131 | { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, |
7927 | { } | 8132 | { } /* end */ |
8133 | }; | ||
8134 | |||
8135 | /* | ||
8136 | * 4ch mode | ||
8137 | */ | ||
8138 | static struct hda_verb alc888_3st_hp_4ch_init[] = { | ||
8139 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, | ||
8140 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | ||
8141 | { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
8142 | { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
8143 | { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, | ||
8144 | { } /* end */ | ||
7928 | }; | 8145 | }; |
7929 | 8146 | ||
8147 | /* | ||
8148 | * 6ch mode | ||
8149 | */ | ||
7930 | static struct hda_verb alc888_3st_hp_6ch_init[] = { | 8150 | static struct hda_verb alc888_3st_hp_6ch_init[] = { |
7931 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 8151 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
7932 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | 8152 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, |
8153 | { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, | ||
7933 | { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 8154 | { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
7934 | { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | 8155 | { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, |
7935 | { } | 8156 | { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, |
8157 | { } /* end */ | ||
7936 | }; | 8158 | }; |
7937 | 8159 | ||
7938 | static struct hda_channel_mode alc888_3st_hp_modes[2] = { | 8160 | static struct hda_channel_mode alc888_3st_hp_modes[3] = { |
7939 | { 2, alc888_3st_hp_2ch_init }, | 8161 | { 2, alc888_3st_hp_2ch_init }, |
8162 | { 4, alc888_3st_hp_4ch_init }, | ||
7940 | { 6, alc888_3st_hp_6ch_init }, | 8163 | { 6, alc888_3st_hp_6ch_init }, |
7941 | }; | 8164 | }; |
7942 | 8165 | ||
@@ -8197,7 +8420,7 @@ static void alc888_6st_dell_unsol_event(struct hda_codec *codec, | |||
8197 | { | 8420 | { |
8198 | switch (res >> 26) { | 8421 | switch (res >> 26) { |
8199 | case ALC880_HP_EVENT: | 8422 | case ALC880_HP_EVENT: |
8200 | printk("hp_event\n"); | 8423 | /* printk(KERN_DEBUG "hp_event\n"); */ |
8201 | alc888_6st_dell_front_automute(codec); | 8424 | alc888_6st_dell_front_automute(codec); |
8202 | break; | 8425 | break; |
8203 | } | 8426 | } |
@@ -8456,6 +8679,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8456 | SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), | 8679 | SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), |
8457 | SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), | 8680 | SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), |
8458 | SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), | 8681 | SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), |
8682 | SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE), | ||
8459 | SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), | 8683 | SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), |
8460 | SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), | 8684 | SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), |
8461 | SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), | 8685 | SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), |
@@ -8463,21 +8687,29 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8463 | ALC888_ACER_ASPIRE_4930G), | 8687 | ALC888_ACER_ASPIRE_4930G), |
8464 | SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", | 8688 | SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", |
8465 | ALC888_ACER_ASPIRE_4930G), | 8689 | ALC888_ACER_ASPIRE_4930G), |
8690 | SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO), | ||
8691 | SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO), | ||
8466 | SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", | 8692 | SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", |
8467 | ALC888_ACER_ASPIRE_4930G), | 8693 | ALC888_ACER_ASPIRE_4930G), |
8468 | SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), /* default Acer */ | 8694 | SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", |
8695 | ALC888_ACER_ASPIRE_4930G), | ||
8696 | /* default Acer */ | ||
8697 | SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), | ||
8469 | SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), | 8698 | SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), |
8470 | SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), | 8699 | SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), |
8471 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), | 8700 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), |
8472 | SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), | 8701 | SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), |
8473 | SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), | 8702 | SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), |
8474 | SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), | 8703 | SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), |
8704 | SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), | ||
8475 | SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), | 8705 | SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), |
8476 | SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), | 8706 | SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), |
8707 | SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), | ||
8477 | SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), | 8708 | SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), |
8478 | SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), | 8709 | SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), |
8479 | SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), | 8710 | SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), |
8480 | SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG), | 8711 | SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG), |
8712 | SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC), | ||
8481 | SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), | 8713 | SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), |
8482 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), | 8714 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), |
8483 | SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), | 8715 | SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), |
@@ -8509,11 +8741,12 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8509 | SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), | 8741 | SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), |
8510 | SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), | 8742 | SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), |
8511 | SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), | 8743 | SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), |
8512 | SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD), | 8744 | SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), |
8513 | SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), | 8745 | SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), |
8514 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), | 8746 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), |
8515 | SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515), | 8747 | SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", |
8516 | SND_PCI_QUIRK(0x1734, 0x113d, "Fujitsu AMILO Xa3530", | 8748 | ALC883_FUJITSU_PI2515), |
8749 | SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", | ||
8517 | ALC888_FUJITSU_XA3530), | 8750 | ALC888_FUJITSU_XA3530), |
8518 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), | 8751 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), |
8519 | SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 8752 | SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
@@ -8526,11 +8759,20 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8526 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), | 8759 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), |
8527 | SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), | 8760 | SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), |
8528 | SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), | 8761 | SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), |
8762 | SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), | ||
8529 | SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL), | 8763 | SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL), |
8530 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), | 8764 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), |
8531 | {} | 8765 | {} |
8532 | }; | 8766 | }; |
8533 | 8767 | ||
8768 | static hda_nid_t alc883_slave_dig_outs[] = { | ||
8769 | ALC1200_DIGOUT_NID, 0, | ||
8770 | }; | ||
8771 | |||
8772 | static hda_nid_t alc1200_slave_dig_outs[] = { | ||
8773 | ALC883_DIGOUT_NID, 0, | ||
8774 | }; | ||
8775 | |||
8534 | static struct alc_config_preset alc883_presets[] = { | 8776 | static struct alc_config_preset alc883_presets[] = { |
8535 | [ALC883_3ST_2ch_DIG] = { | 8777 | [ALC883_3ST_2ch_DIG] = { |
8536 | .mixers = { alc883_3ST_2ch_mixer }, | 8778 | .mixers = { alc883_3ST_2ch_mixer }, |
@@ -8572,6 +8814,7 @@ static struct alc_config_preset alc883_presets[] = { | |||
8572 | .dac_nids = alc883_dac_nids, | 8814 | .dac_nids = alc883_dac_nids, |
8573 | .dig_out_nid = ALC883_DIGOUT_NID, | 8815 | .dig_out_nid = ALC883_DIGOUT_NID, |
8574 | .dig_in_nid = ALC883_DIGIN_NID, | 8816 | .dig_in_nid = ALC883_DIGIN_NID, |
8817 | .slave_dig_outs = alc883_slave_dig_outs, | ||
8575 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), | 8818 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), |
8576 | .channel_mode = alc883_3ST_6ch_intel_modes, | 8819 | .channel_mode = alc883_3ST_6ch_intel_modes, |
8577 | .need_dac_fix = 1, | 8820 | .need_dac_fix = 1, |
@@ -8766,6 +9009,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
8766 | .channel_mode = alc888_3st_hp_modes, | 9009 | .channel_mode = alc888_3st_hp_modes, |
8767 | .need_dac_fix = 1, | 9010 | .need_dac_fix = 1, |
8768 | .input_mux = &alc883_capture_source, | 9011 | .input_mux = &alc883_capture_source, |
9012 | .unsol_event = alc888_3st_hp_unsol_event, | ||
9013 | .init_hook = alc888_3st_hp_front_automute, | ||
8769 | }, | 9014 | }, |
8770 | [ALC888_6ST_DELL] = { | 9015 | [ALC888_6ST_DELL] = { |
8771 | .mixers = { alc883_base_mixer, alc883_chmode_mixer }, | 9016 | .mixers = { alc883_base_mixer, alc883_chmode_mixer }, |
@@ -8871,6 +9116,7 @@ static struct alc_config_preset alc883_presets[] = { | |||
8871 | .dac_nids = alc883_dac_nids, | 9116 | .dac_nids = alc883_dac_nids, |
8872 | .dig_out_nid = ALC1200_DIGOUT_NID, | 9117 | .dig_out_nid = ALC1200_DIGOUT_NID, |
8873 | .dig_in_nid = ALC883_DIGIN_NID, | 9118 | .dig_in_nid = ALC883_DIGIN_NID, |
9119 | .slave_dig_outs = alc1200_slave_dig_outs, | ||
8874 | .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), | 9120 | .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), |
8875 | .channel_mode = alc883_sixstack_modes, | 9121 | .channel_mode = alc883_sixstack_modes, |
8876 | .input_mux = &alc883_capture_source, | 9122 | .input_mux = &alc883_capture_source, |
@@ -8938,11 +9184,9 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec) | |||
8938 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 9184 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
8939 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 9185 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
8940 | if (alc883_is_input_pin(nid)) { | 9186 | if (alc883_is_input_pin(nid)) { |
8941 | snd_hda_codec_write(codec, nid, 0, | 9187 | alc_set_input_pin(codec, nid, i); |
8942 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 9188 | if (nid != ALC883_PIN_CD_NID && |
8943 | (i <= AUTO_PIN_FRONT_MIC ? | 9189 | (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) |
8944 | PIN_VREF80 : PIN_IN)); | ||
8945 | if (nid != ALC883_PIN_CD_NID) | ||
8946 | snd_hda_codec_write(codec, nid, 0, | 9190 | snd_hda_codec_write(codec, nid, 0, |
8947 | AC_VERB_SET_AMP_GAIN_MUTE, | 9191 | AC_VERB_SET_AMP_GAIN_MUTE, |
8948 | AMP_OUT_MUTE); | 9192 | AMP_OUT_MUTE); |
@@ -8957,6 +9201,8 @@ static int alc883_parse_auto_config(struct hda_codec *codec) | |||
8957 | { | 9201 | { |
8958 | struct alc_spec *spec = codec->spec; | 9202 | struct alc_spec *spec = codec->spec; |
8959 | int err = alc880_parse_auto_config(codec); | 9203 | int err = alc880_parse_auto_config(codec); |
9204 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
9205 | int i; | ||
8960 | 9206 | ||
8961 | if (err < 0) | 9207 | if (err < 0) |
8962 | return err; | 9208 | return err; |
@@ -8970,6 +9216,26 @@ static int alc883_parse_auto_config(struct hda_codec *codec) | |||
8970 | /* hack - override the init verbs */ | 9216 | /* hack - override the init verbs */ |
8971 | spec->init_verbs[0] = alc883_auto_init_verbs; | 9217 | spec->init_verbs[0] = alc883_auto_init_verbs; |
8972 | 9218 | ||
9219 | /* setup input_mux for ALC889 */ | ||
9220 | if (codec->vendor_id == 0x10ec0889) { | ||
9221 | /* digital-mic input pin is excluded in alc880_auto_create..() | ||
9222 | * because it's under 0x18 | ||
9223 | */ | ||
9224 | if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || | ||
9225 | cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { | ||
9226 | struct hda_input_mux *imux = &spec->private_imux[0]; | ||
9227 | for (i = 1; i < 3; i++) | ||
9228 | memcpy(&spec->private_imux[i], | ||
9229 | &spec->private_imux[0], | ||
9230 | sizeof(spec->private_imux[0])); | ||
9231 | imux->items[imux->num_items].label = "Int DMic"; | ||
9232 | imux->items[imux->num_items].index = 0x0b; | ||
9233 | imux->num_items++; | ||
9234 | spec->num_mux_defs = 3; | ||
9235 | spec->input_mux = spec->private_imux; | ||
9236 | } | ||
9237 | } | ||
9238 | |||
8973 | return 1; /* config found */ | 9239 | return 1; /* config found */ |
8974 | } | 9240 | } |
8975 | 9241 | ||
@@ -9021,6 +9287,12 @@ static int patch_alc883(struct hda_codec *codec) | |||
9021 | } | 9287 | } |
9022 | } | 9288 | } |
9023 | 9289 | ||
9290 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
9291 | if (err < 0) { | ||
9292 | alc_free(codec); | ||
9293 | return err; | ||
9294 | } | ||
9295 | |||
9024 | if (board_config != ALC883_AUTO) | 9296 | if (board_config != ALC883_AUTO) |
9025 | setup_preset(spec, &alc883_presets[board_config]); | 9297 | setup_preset(spec, &alc883_presets[board_config]); |
9026 | 9298 | ||
@@ -9033,14 +9305,36 @@ static int patch_alc883(struct hda_codec *codec) | |||
9033 | spec->stream_name_analog = "ALC888 Analog"; | 9305 | spec->stream_name_analog = "ALC888 Analog"; |
9034 | spec->stream_name_digital = "ALC888 Digital"; | 9306 | spec->stream_name_digital = "ALC888 Digital"; |
9035 | } | 9307 | } |
9308 | if (!spec->num_adc_nids) { | ||
9309 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); | ||
9310 | spec->adc_nids = alc883_adc_nids; | ||
9311 | } | ||
9312 | if (!spec->capsrc_nids) | ||
9313 | spec->capsrc_nids = alc883_capsrc_nids; | ||
9314 | spec->capture_style = CAPT_MIX; /* matrix-style capture */ | ||
9036 | break; | 9315 | break; |
9037 | case 0x10ec0889: | 9316 | case 0x10ec0889: |
9038 | spec->stream_name_analog = "ALC889 Analog"; | 9317 | spec->stream_name_analog = "ALC889 Analog"; |
9039 | spec->stream_name_digital = "ALC889 Digital"; | 9318 | spec->stream_name_digital = "ALC889 Digital"; |
9319 | if (!spec->num_adc_nids) { | ||
9320 | spec->num_adc_nids = ARRAY_SIZE(alc889_adc_nids); | ||
9321 | spec->adc_nids = alc889_adc_nids; | ||
9322 | } | ||
9323 | if (!spec->capsrc_nids) | ||
9324 | spec->capsrc_nids = alc889_capsrc_nids; | ||
9325 | spec->capture_style = CAPT_1MUX_MIX; /* 1mux/Nmix-style | ||
9326 | capture */ | ||
9040 | break; | 9327 | break; |
9041 | default: | 9328 | default: |
9042 | spec->stream_name_analog = "ALC883 Analog"; | 9329 | spec->stream_name_analog = "ALC883 Analog"; |
9043 | spec->stream_name_digital = "ALC883 Digital"; | 9330 | spec->stream_name_digital = "ALC883 Digital"; |
9331 | if (!spec->num_adc_nids) { | ||
9332 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); | ||
9333 | spec->adc_nids = alc883_adc_nids; | ||
9334 | } | ||
9335 | if (!spec->capsrc_nids) | ||
9336 | spec->capsrc_nids = alc883_capsrc_nids; | ||
9337 | spec->capture_style = CAPT_MIX; /* matrix-style capture */ | ||
9044 | break; | 9338 | break; |
9045 | } | 9339 | } |
9046 | 9340 | ||
@@ -9051,15 +9345,9 @@ static int patch_alc883(struct hda_codec *codec) | |||
9051 | spec->stream_digital_playback = &alc883_pcm_digital_playback; | 9345 | spec->stream_digital_playback = &alc883_pcm_digital_playback; |
9052 | spec->stream_digital_capture = &alc883_pcm_digital_capture; | 9346 | spec->stream_digital_capture = &alc883_pcm_digital_capture; |
9053 | 9347 | ||
9054 | if (!spec->num_adc_nids) { | ||
9055 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); | ||
9056 | spec->adc_nids = alc883_adc_nids; | ||
9057 | } | ||
9058 | if (!spec->capsrc_nids) | ||
9059 | spec->capsrc_nids = alc883_capsrc_nids; | ||
9060 | spec->is_mix_capture = 1; /* matrix-style capture */ | ||
9061 | if (!spec->cap_mixer) | 9348 | if (!spec->cap_mixer) |
9062 | set_capture_mixer(spec); | 9349 | set_capture_mixer(spec); |
9350 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
9063 | 9351 | ||
9064 | spec->vmaster_nid = 0x0c; | 9352 | spec->vmaster_nid = 0x0c; |
9065 | 9353 | ||
@@ -9112,8 +9400,6 @@ static struct snd_kcontrol_new alc262_base_mixer[] = { | |||
9112 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 9400 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
9113 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 9401 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
9114 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 9402 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
9115 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
9116 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), */ | ||
9117 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), | 9403 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), |
9118 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 9404 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
9119 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 9405 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
@@ -9134,8 +9420,6 @@ static struct snd_kcontrol_new alc262_hippo1_mixer[] = { | |||
9134 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 9420 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
9135 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 9421 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
9136 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 9422 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
9137 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
9138 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), */ | ||
9139 | /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ | 9423 | /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ |
9140 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 9424 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
9141 | { } /* end */ | 9425 | { } /* end */ |
@@ -9244,8 +9528,6 @@ static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { | |||
9244 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 9528 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
9245 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 9529 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
9246 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 9530 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
9247 | HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
9248 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
9249 | HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT), | 9531 | HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT), |
9250 | HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT), | 9532 | HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT), |
9251 | { } /* end */ | 9533 | { } /* end */ |
@@ -9274,8 +9556,6 @@ static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { | |||
9274 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), | 9556 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), |
9275 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 9557 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
9276 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 9558 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
9277 | HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
9278 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
9279 | { } /* end */ | 9559 | { } /* end */ |
9280 | }; | 9560 | }; |
9281 | 9561 | ||
@@ -9423,6 +9703,67 @@ static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { | |||
9423 | { } /* end */ | 9703 | { } /* end */ |
9424 | }; | 9704 | }; |
9425 | 9705 | ||
9706 | static struct snd_kcontrol_new alc262_tyan_mixer[] = { | ||
9707 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
9708 | HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), | ||
9709 | HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT), | ||
9710 | HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT), | ||
9711 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
9712 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
9713 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
9714 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
9715 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
9716 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
9717 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
9718 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | ||
9719 | { } /* end */ | ||
9720 | }; | ||
9721 | |||
9722 | static struct hda_verb alc262_tyan_verbs[] = { | ||
9723 | /* Headphone automute */ | ||
9724 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
9725 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
9726 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
9727 | |||
9728 | /* P11 AUX_IN, white 4-pin connector */ | ||
9729 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
9730 | {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1}, | ||
9731 | {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93}, | ||
9732 | {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19}, | ||
9733 | |||
9734 | {} | ||
9735 | }; | ||
9736 | |||
9737 | /* unsolicited event for HP jack sensing */ | ||
9738 | static void alc262_tyan_automute(struct hda_codec *codec) | ||
9739 | { | ||
9740 | unsigned int mute; | ||
9741 | unsigned int present; | ||
9742 | |||
9743 | snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
9744 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
9745 | AC_VERB_GET_PIN_SENSE, 0); | ||
9746 | present = (present & 0x80000000) != 0; | ||
9747 | if (present) { | ||
9748 | /* mute line output on ATX panel */ | ||
9749 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
9750 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
9751 | } else { | ||
9752 | /* unmute line output if necessary */ | ||
9753 | mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); | ||
9754 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
9755 | HDA_AMP_MUTE, mute); | ||
9756 | } | ||
9757 | } | ||
9758 | |||
9759 | static void alc262_tyan_unsol_event(struct hda_codec *codec, | ||
9760 | unsigned int res) | ||
9761 | { | ||
9762 | if ((res >> 26) != ALC880_HP_EVENT) | ||
9763 | return; | ||
9764 | alc262_tyan_automute(codec); | ||
9765 | } | ||
9766 | |||
9426 | #define alc262_capture_mixer alc882_capture_mixer | 9767 | #define alc262_capture_mixer alc882_capture_mixer |
9427 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer | 9768 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer |
9428 | 9769 | ||
@@ -9889,8 +10230,6 @@ static struct snd_kcontrol_new alc262_fujitsu_mixer[] = { | |||
9889 | }, | 10230 | }, |
9890 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 10231 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
9891 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 10232 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
9892 | HDA_CODEC_VOLUME("PC Speaker Volume", 0x0b, 0x05, HDA_INPUT), | ||
9893 | HDA_CODEC_MUTE("PC Speaker Switch", 0x0b, 0x05, HDA_INPUT), | ||
9894 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 10233 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
9895 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 10234 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
9896 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 10235 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
@@ -10462,8 +10801,14 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
10462 | alc262_ignore); | 10801 | alc262_ignore); |
10463 | if (err < 0) | 10802 | if (err < 0) |
10464 | return err; | 10803 | return err; |
10465 | if (!spec->autocfg.line_outs) | 10804 | if (!spec->autocfg.line_outs) { |
10805 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { | ||
10806 | spec->multiout.max_channels = 2; | ||
10807 | spec->no_analog = 1; | ||
10808 | goto dig_only; | ||
10809 | } | ||
10466 | return 0; /* can't find valid BIOS pin config */ | 10810 | return 0; /* can't find valid BIOS pin config */ |
10811 | } | ||
10467 | err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg); | 10812 | err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg); |
10468 | if (err < 0) | 10813 | if (err < 0) |
10469 | return err; | 10814 | return err; |
@@ -10473,8 +10818,11 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
10473 | 10818 | ||
10474 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 10819 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
10475 | 10820 | ||
10476 | if (spec->autocfg.dig_out_pin) | 10821 | dig_only: |
10822 | if (spec->autocfg.dig_outs) { | ||
10477 | spec->multiout.dig_out_nid = ALC262_DIGOUT_NID; | 10823 | spec->multiout.dig_out_nid = ALC262_DIGOUT_NID; |
10824 | spec->dig_out_type = spec->autocfg.dig_out_type[0]; | ||
10825 | } | ||
10478 | if (spec->autocfg.dig_in_pin) | 10826 | if (spec->autocfg.dig_in_pin) |
10479 | spec->dig_in_nid = ALC262_DIGIN_NID; | 10827 | spec->dig_in_nid = ALC262_DIGIN_NID; |
10480 | 10828 | ||
@@ -10483,13 +10831,12 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
10483 | 10831 | ||
10484 | add_verb(spec, alc262_volume_init_verbs); | 10832 | add_verb(spec, alc262_volume_init_verbs); |
10485 | spec->num_mux_defs = 1; | 10833 | spec->num_mux_defs = 1; |
10486 | spec->input_mux = &spec->private_imux; | 10834 | spec->input_mux = &spec->private_imux[0]; |
10487 | 10835 | ||
10488 | err = alc_auto_add_mic_boost(codec); | 10836 | err = alc_auto_add_mic_boost(codec); |
10489 | if (err < 0) | 10837 | if (err < 0) |
10490 | return err; | 10838 | return err; |
10491 | 10839 | ||
10492 | store_pin_configs(codec); | ||
10493 | return 1; | 10840 | return 1; |
10494 | } | 10841 | } |
10495 | 10842 | ||
@@ -10531,20 +10878,19 @@ static const char *alc262_models[ALC262_MODEL_LAST] = { | |||
10531 | [ALC262_ULTRA] = "ultra", | 10878 | [ALC262_ULTRA] = "ultra", |
10532 | [ALC262_LENOVO_3000] = "lenovo-3000", | 10879 | [ALC262_LENOVO_3000] = "lenovo-3000", |
10533 | [ALC262_NEC] = "nec", | 10880 | [ALC262_NEC] = "nec", |
10881 | [ALC262_TYAN] = "tyan", | ||
10534 | [ALC262_AUTO] = "auto", | 10882 | [ALC262_AUTO] = "auto", |
10535 | }; | 10883 | }; |
10536 | 10884 | ||
10537 | static struct snd_pci_quirk alc262_cfg_tbl[] = { | 10885 | static struct snd_pci_quirk alc262_cfg_tbl[] = { |
10538 | SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), | 10886 | SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), |
10539 | SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), | 10887 | SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), |
10540 | SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC), | 10888 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series", |
10541 | SND_PCI_QUIRK(0x103c, 0x12ff, "HP xw4550", ALC262_HP_BPC), | 10889 | ALC262_HP_BPC), |
10542 | SND_PCI_QUIRK(0x103c, 0x1306, "HP xw8600", ALC262_HP_BPC), | 10890 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series", |
10543 | SND_PCI_QUIRK(0x103c, 0x1307, "HP xw6600", ALC262_HP_BPC), | 10891 | ALC262_HP_BPC), |
10544 | SND_PCI_QUIRK(0x103c, 0x1308, "HP xw4600", ALC262_HP_BPC), | 10892 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", |
10545 | SND_PCI_QUIRK(0x103c, 0x1309, "HP xw4*00", ALC262_HP_BPC), | 10893 | ALC262_HP_BPC), |
10546 | SND_PCI_QUIRK(0x103c, 0x130a, "HP xw6*00", ALC262_HP_BPC), | ||
10547 | SND_PCI_QUIRK(0x103c, 0x130b, "HP xw8*00", ALC262_HP_BPC), | ||
10548 | SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), | 10894 | SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), |
10549 | SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), | 10895 | SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), |
10550 | SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), | 10896 | SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), |
@@ -10562,17 +10908,18 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = { | |||
10562 | SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD), | 10908 | SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD), |
10563 | SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), | 10909 | SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), |
10564 | SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), | 10910 | SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), |
10565 | SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", ALC262_SONY_ASSAMD), | 10911 | SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */ |
10566 | SND_PCI_QUIRK(0x104d, 0x9015, "Sony 0x9015", ALC262_SONY_ASSAMD), | 10912 | SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", |
10567 | SND_PCI_QUIRK(0x104d, 0x9033, "Sony VAIO VGN-SR19XN", | 10913 | ALC262_SONY_ASSAMD), |
10568 | ALC262_SONY_ASSAMD), | ||
10569 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", | 10914 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", |
10570 | ALC262_TOSHIBA_RX1), | 10915 | ALC262_TOSHIBA_RX1), |
10571 | SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), | 10916 | SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), |
10572 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), | 10917 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), |
10573 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), | 10918 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), |
10574 | SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA), | 10919 | SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN), |
10575 | SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA), | 10920 | SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1", |
10921 | ALC262_ULTRA), | ||
10922 | SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO), | ||
10576 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000), | 10923 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000), |
10577 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), | 10924 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), |
10578 | SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), | 10925 | SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), |
@@ -10788,6 +11135,19 @@ static struct alc_config_preset alc262_presets[] = { | |||
10788 | .unsol_event = alc262_hippo_unsol_event, | 11135 | .unsol_event = alc262_hippo_unsol_event, |
10789 | .init_hook = alc262_hippo_automute, | 11136 | .init_hook = alc262_hippo_automute, |
10790 | }, | 11137 | }, |
11138 | [ALC262_TYAN] = { | ||
11139 | .mixers = { alc262_tyan_mixer }, | ||
11140 | .init_verbs = { alc262_init_verbs, alc262_tyan_verbs}, | ||
11141 | .num_dacs = ARRAY_SIZE(alc262_dac_nids), | ||
11142 | .dac_nids = alc262_dac_nids, | ||
11143 | .hp_nid = 0x02, | ||
11144 | .dig_out_nid = ALC262_DIGOUT_NID, | ||
11145 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | ||
11146 | .channel_mode = alc262_modes, | ||
11147 | .input_mux = &alc262_capture_source, | ||
11148 | .unsol_event = alc262_tyan_unsol_event, | ||
11149 | .init_hook = alc262_tyan_automute, | ||
11150 | }, | ||
10791 | }; | 11151 | }; |
10792 | 11152 | ||
10793 | static int patch_alc262(struct hda_codec *codec) | 11153 | static int patch_alc262(struct hda_codec *codec) |
@@ -10840,6 +11200,14 @@ static int patch_alc262(struct hda_codec *codec) | |||
10840 | } | 11200 | } |
10841 | } | 11201 | } |
10842 | 11202 | ||
11203 | if (!spec->no_analog) { | ||
11204 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
11205 | if (err < 0) { | ||
11206 | alc_free(codec); | ||
11207 | return err; | ||
11208 | } | ||
11209 | } | ||
11210 | |||
10843 | if (board_config != ALC262_AUTO) | 11211 | if (board_config != ALC262_AUTO) |
10844 | setup_preset(spec, &alc262_presets[board_config]); | 11212 | setup_preset(spec, &alc262_presets[board_config]); |
10845 | 11213 | ||
@@ -10851,7 +11219,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
10851 | spec->stream_digital_playback = &alc262_pcm_digital_playback; | 11219 | spec->stream_digital_playback = &alc262_pcm_digital_playback; |
10852 | spec->stream_digital_capture = &alc262_pcm_digital_capture; | 11220 | spec->stream_digital_capture = &alc262_pcm_digital_capture; |
10853 | 11221 | ||
10854 | spec->is_mix_capture = 1; | 11222 | spec->capture_style = CAPT_MIX; |
10855 | if (!spec->adc_nids && spec->input_mux) { | 11223 | if (!spec->adc_nids && spec->input_mux) { |
10856 | /* check whether NID 0x07 is valid */ | 11224 | /* check whether NID 0x07 is valid */ |
10857 | unsigned int wcap = get_wcaps(codec, 0x07); | 11225 | unsigned int wcap = get_wcaps(codec, 0x07); |
@@ -10868,8 +11236,10 @@ static int patch_alc262(struct hda_codec *codec) | |||
10868 | spec->capsrc_nids = alc262_capsrc_nids; | 11236 | spec->capsrc_nids = alc262_capsrc_nids; |
10869 | } | 11237 | } |
10870 | } | 11238 | } |
10871 | if (!spec->cap_mixer) | 11239 | if (!spec->cap_mixer && !spec->no_analog) |
10872 | set_capture_mixer(spec); | 11240 | set_capture_mixer(spec); |
11241 | if (!spec->no_analog) | ||
11242 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
10873 | 11243 | ||
10874 | spec->vmaster_nid = 0x0c; | 11244 | spec->vmaster_nid = 0x0c; |
10875 | 11245 | ||
@@ -11249,19 +11619,13 @@ static void alc267_quanta_il1_unsol_event(struct hda_codec *codec, | |||
11249 | static struct hda_verb alc268_base_init_verbs[] = { | 11619 | static struct hda_verb alc268_base_init_verbs[] = { |
11250 | /* Unmute DAC0-1 and set vol = 0 */ | 11620 | /* Unmute DAC0-1 and set vol = 0 */ |
11251 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 11621 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
11252 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11253 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11254 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 11622 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
11255 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11256 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11257 | 11623 | ||
11258 | /* | 11624 | /* |
11259 | * Set up output mixers (0x0c - 0x0e) | 11625 | * Set up output mixers (0x0c - 0x0e) |
11260 | */ | 11626 | */ |
11261 | /* set vol=0 to output mixers */ | 11627 | /* set vol=0 to output mixers */ |
11262 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11628 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
11263 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11264 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
11265 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, | 11629 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, |
11266 | 11630 | ||
11267 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11631 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
@@ -11280,9 +11644,7 @@ static struct hda_verb alc268_base_init_verbs[] = { | |||
11280 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11644 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11281 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11645 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11282 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11646 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11283 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11284 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11647 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11285 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11286 | 11648 | ||
11287 | /* set PCBEEP vol = 0, mute connections */ | 11649 | /* set PCBEEP vol = 0, mute connections */ |
11288 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11650 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
@@ -11304,10 +11666,8 @@ static struct hda_verb alc268_base_init_verbs[] = { | |||
11304 | */ | 11666 | */ |
11305 | static struct hda_verb alc268_volume_init_verbs[] = { | 11667 | static struct hda_verb alc268_volume_init_verbs[] = { |
11306 | /* set output DAC */ | 11668 | /* set output DAC */ |
11307 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11669 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
11308 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 11670 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
11309 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11310 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11311 | 11671 | ||
11312 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, | 11672 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, |
11313 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, | 11673 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, |
@@ -11315,16 +11675,12 @@ static struct hda_verb alc268_volume_init_verbs[] = { | |||
11315 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 11675 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, |
11316 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 11676 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, |
11317 | 11677 | ||
11318 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
11319 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11678 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
11320 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11321 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11679 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
11322 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11680 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
11323 | 11681 | ||
11324 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11682 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11325 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11326 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11683 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
11327 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11328 | 11684 | ||
11329 | /* set PCBEEP vol = 0, mute connections */ | 11685 | /* set PCBEEP vol = 0, mute connections */ |
11330 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11686 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
@@ -11523,7 +11879,7 @@ static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec, | |||
11523 | static int alc268_auto_create_analog_input_ctls(struct alc_spec *spec, | 11879 | static int alc268_auto_create_analog_input_ctls(struct alc_spec *spec, |
11524 | const struct auto_pin_cfg *cfg) | 11880 | const struct auto_pin_cfg *cfg) |
11525 | { | 11881 | { |
11526 | struct hda_input_mux *imux = &spec->private_imux; | 11882 | struct hda_input_mux *imux = &spec->private_imux[0]; |
11527 | int i, idx1; | 11883 | int i, idx1; |
11528 | 11884 | ||
11529 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 11885 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
@@ -11617,9 +11973,14 @@ static int alc268_parse_auto_config(struct hda_codec *codec) | |||
11617 | alc268_ignore); | 11973 | alc268_ignore); |
11618 | if (err < 0) | 11974 | if (err < 0) |
11619 | return err; | 11975 | return err; |
11620 | if (!spec->autocfg.line_outs) | 11976 | if (!spec->autocfg.line_outs) { |
11977 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { | ||
11978 | spec->multiout.max_channels = 2; | ||
11979 | spec->no_analog = 1; | ||
11980 | goto dig_only; | ||
11981 | } | ||
11621 | return 0; /* can't find valid BIOS pin config */ | 11982 | return 0; /* can't find valid BIOS pin config */ |
11622 | 11983 | } | |
11623 | err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg); | 11984 | err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg); |
11624 | if (err < 0) | 11985 | if (err < 0) |
11625 | return err; | 11986 | return err; |
@@ -11629,25 +11990,26 @@ static int alc268_parse_auto_config(struct hda_codec *codec) | |||
11629 | 11990 | ||
11630 | spec->multiout.max_channels = 2; | 11991 | spec->multiout.max_channels = 2; |
11631 | 11992 | ||
11993 | dig_only: | ||
11632 | /* digital only support output */ | 11994 | /* digital only support output */ |
11633 | if (spec->autocfg.dig_out_pin) | 11995 | if (spec->autocfg.dig_outs) { |
11634 | spec->multiout.dig_out_nid = ALC268_DIGOUT_NID; | 11996 | spec->multiout.dig_out_nid = ALC268_DIGOUT_NID; |
11635 | 11997 | spec->dig_out_type = spec->autocfg.dig_out_type[0]; | |
11998 | } | ||
11636 | if (spec->kctls.list) | 11999 | if (spec->kctls.list) |
11637 | add_mixer(spec, spec->kctls.list); | 12000 | add_mixer(spec, spec->kctls.list); |
11638 | 12001 | ||
11639 | if (spec->autocfg.speaker_pins[0] != 0x1d) | 12002 | if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) |
11640 | add_mixer(spec, alc268_beep_mixer); | 12003 | add_mixer(spec, alc268_beep_mixer); |
11641 | 12004 | ||
11642 | add_verb(spec, alc268_volume_init_verbs); | 12005 | add_verb(spec, alc268_volume_init_verbs); |
11643 | spec->num_mux_defs = 1; | 12006 | spec->num_mux_defs = 1; |
11644 | spec->input_mux = &spec->private_imux; | 12007 | spec->input_mux = &spec->private_imux[0]; |
11645 | 12008 | ||
11646 | err = alc_auto_add_mic_boost(codec); | 12009 | err = alc_auto_add_mic_boost(codec); |
11647 | if (err < 0) | 12010 | if (err < 0) |
11648 | return err; | 12011 | return err; |
11649 | 12012 | ||
11650 | store_pin_configs(codec); | ||
11651 | return 1; | 12013 | return 1; |
11652 | } | 12014 | } |
11653 | 12015 | ||
@@ -11709,7 +12071,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
11709 | 12071 | ||
11710 | static struct alc_config_preset alc268_presets[] = { | 12072 | static struct alc_config_preset alc268_presets[] = { |
11711 | [ALC267_QUANTA_IL1] = { | 12073 | [ALC267_QUANTA_IL1] = { |
11712 | .mixers = { alc267_quanta_il1_mixer }, | 12074 | .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, |
11713 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, | 12075 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, |
11714 | alc267_quanta_il1_verbs }, | 12076 | alc267_quanta_il1_verbs }, |
11715 | .num_dacs = ARRAY_SIZE(alc268_dac_nids), | 12077 | .num_dacs = ARRAY_SIZE(alc268_dac_nids), |
@@ -11791,7 +12153,8 @@ static struct alc_config_preset alc268_presets[] = { | |||
11791 | }, | 12153 | }, |
11792 | [ALC268_ACER_ASPIRE_ONE] = { | 12154 | [ALC268_ACER_ASPIRE_ONE] = { |
11793 | .mixers = { alc268_acer_aspire_one_mixer, | 12155 | .mixers = { alc268_acer_aspire_one_mixer, |
11794 | alc268_capture_alt_mixer }, | 12156 | alc268_beep_mixer, |
12157 | alc268_capture_alt_mixer }, | ||
11795 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, | 12158 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, |
11796 | alc268_acer_aspire_one_verbs }, | 12159 | alc268_acer_aspire_one_verbs }, |
11797 | .num_dacs = ARRAY_SIZE(alc268_dac_nids), | 12160 | .num_dacs = ARRAY_SIZE(alc268_dac_nids), |
@@ -11860,7 +12223,7 @@ static int patch_alc268(struct hda_codec *codec) | |||
11860 | { | 12223 | { |
11861 | struct alc_spec *spec; | 12224 | struct alc_spec *spec; |
11862 | int board_config; | 12225 | int board_config; |
11863 | int err; | 12226 | int i, has_beep, err; |
11864 | 12227 | ||
11865 | spec = kcalloc(1, sizeof(*spec), GFP_KERNEL); | 12228 | spec = kcalloc(1, sizeof(*spec), GFP_KERNEL); |
11866 | if (spec == NULL) | 12229 | if (spec == NULL) |
@@ -11909,15 +12272,30 @@ static int patch_alc268(struct hda_codec *codec) | |||
11909 | 12272 | ||
11910 | spec->stream_digital_playback = &alc268_pcm_digital_playback; | 12273 | spec->stream_digital_playback = &alc268_pcm_digital_playback; |
11911 | 12274 | ||
11912 | if (!query_amp_caps(codec, 0x1d, HDA_INPUT)) | 12275 | has_beep = 0; |
11913 | /* override the amp caps for beep generator */ | 12276 | for (i = 0; i < spec->num_mixers; i++) { |
11914 | snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT, | 12277 | if (spec->mixers[i] == alc268_beep_mixer) { |
12278 | has_beep = 1; | ||
12279 | break; | ||
12280 | } | ||
12281 | } | ||
12282 | |||
12283 | if (has_beep) { | ||
12284 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
12285 | if (err < 0) { | ||
12286 | alc_free(codec); | ||
12287 | return err; | ||
12288 | } | ||
12289 | if (!query_amp_caps(codec, 0x1d, HDA_INPUT)) | ||
12290 | /* override the amp caps for beep generator */ | ||
12291 | snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT, | ||
11915 | (0x0c << AC_AMPCAP_OFFSET_SHIFT) | | 12292 | (0x0c << AC_AMPCAP_OFFSET_SHIFT) | |
11916 | (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) | | 12293 | (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) | |
11917 | (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) | | 12294 | (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) | |
11918 | (0 << AC_AMPCAP_MUTE_SHIFT)); | 12295 | (0 << AC_AMPCAP_MUTE_SHIFT)); |
12296 | } | ||
11919 | 12297 | ||
11920 | if (!spec->adc_nids && spec->input_mux) { | 12298 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { |
11921 | /* check whether NID 0x07 is valid */ | 12299 | /* check whether NID 0x07 is valid */ |
11922 | unsigned int wcap = get_wcaps(codec, 0x07); | 12300 | unsigned int wcap = get_wcaps(codec, 0x07); |
11923 | int i; | 12301 | int i; |
@@ -11998,8 +12376,6 @@ static struct snd_kcontrol_new alc269_base_mixer[] = { | |||
11998 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 12376 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
11999 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 12377 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
12000 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 12378 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
12001 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x4, HDA_INPUT), | ||
12002 | HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x4, HDA_INPUT), | ||
12003 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 12379 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
12004 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 12380 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
12005 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 12381 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
@@ -12026,8 +12402,6 @@ static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { | |||
12026 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 12402 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
12027 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 12403 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
12028 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), | 12404 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), |
12029 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
12030 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
12031 | { } | 12405 | { } |
12032 | }; | 12406 | }; |
12033 | 12407 | ||
@@ -12051,8 +12425,6 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = { | |||
12051 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT), | 12425 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT), |
12052 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT), | 12426 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT), |
12053 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT), | 12427 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT), |
12054 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
12055 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
12056 | { } | 12428 | { } |
12057 | }; | 12429 | }; |
12058 | 12430 | ||
@@ -12089,13 +12461,6 @@ static struct snd_kcontrol_new alc269_fujitsu_mixer[] = { | |||
12089 | { } /* end */ | 12461 | { } /* end */ |
12090 | }; | 12462 | }; |
12091 | 12463 | ||
12092 | /* beep control */ | ||
12093 | static struct snd_kcontrol_new alc269_beep_mixer[] = { | ||
12094 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x4, HDA_INPUT), | ||
12095 | HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x4, HDA_INPUT), | ||
12096 | { } /* end */ | ||
12097 | }; | ||
12098 | |||
12099 | static struct hda_verb alc269_quanta_fl1_verbs[] = { | 12464 | static struct hda_verb alc269_quanta_fl1_verbs[] = { |
12100 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | 12465 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
12101 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 12466 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
@@ -12495,7 +12860,7 @@ static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec, | |||
12495 | */ | 12860 | */ |
12496 | if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || | 12861 | if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || |
12497 | cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { | 12862 | cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { |
12498 | struct hda_input_mux *imux = &spec->private_imux; | 12863 | struct hda_input_mux *imux = &spec->private_imux[0]; |
12499 | imux->items[imux->num_items].label = "Int Mic"; | 12864 | imux->items[imux->num_items].label = "Int Mic"; |
12500 | imux->items[imux->num_items].index = 0x05; | 12865 | imux->items[imux->num_items].index = 0x05; |
12501 | imux->num_items++; | 12866 | imux->num_items++; |
@@ -12513,13 +12878,34 @@ static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec, | |||
12513 | #define alc269_pcm_digital_playback alc880_pcm_digital_playback | 12878 | #define alc269_pcm_digital_playback alc880_pcm_digital_playback |
12514 | #define alc269_pcm_digital_capture alc880_pcm_digital_capture | 12879 | #define alc269_pcm_digital_capture alc880_pcm_digital_capture |
12515 | 12880 | ||
12881 | static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { | ||
12882 | .substreams = 1, | ||
12883 | .channels_min = 2, | ||
12884 | .channels_max = 8, | ||
12885 | .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ | ||
12886 | /* NID is set in alc_build_pcms */ | ||
12887 | .ops = { | ||
12888 | .open = alc880_playback_pcm_open, | ||
12889 | .prepare = alc880_playback_pcm_prepare, | ||
12890 | .cleanup = alc880_playback_pcm_cleanup | ||
12891 | }, | ||
12892 | }; | ||
12893 | |||
12894 | static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { | ||
12895 | .substreams = 1, | ||
12896 | .channels_min = 2, | ||
12897 | .channels_max = 2, | ||
12898 | .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ | ||
12899 | /* NID is set in alc_build_pcms */ | ||
12900 | }; | ||
12901 | |||
12516 | /* | 12902 | /* |
12517 | * BIOS auto configuration | 12903 | * BIOS auto configuration |
12518 | */ | 12904 | */ |
12519 | static int alc269_parse_auto_config(struct hda_codec *codec) | 12905 | static int alc269_parse_auto_config(struct hda_codec *codec) |
12520 | { | 12906 | { |
12521 | struct alc_spec *spec = codec->spec; | 12907 | struct alc_spec *spec = codec->spec; |
12522 | int i, err; | 12908 | int err; |
12523 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; | 12909 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; |
12524 | 12910 | ||
12525 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, | 12911 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, |
@@ -12536,22 +12922,15 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
12536 | 12922 | ||
12537 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 12923 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
12538 | 12924 | ||
12539 | if (spec->autocfg.dig_out_pin) | 12925 | if (spec->autocfg.dig_outs) |
12540 | spec->multiout.dig_out_nid = ALC269_DIGOUT_NID; | 12926 | spec->multiout.dig_out_nid = ALC269_DIGOUT_NID; |
12541 | 12927 | ||
12542 | if (spec->kctls.list) | 12928 | if (spec->kctls.list) |
12543 | add_mixer(spec, spec->kctls.list); | 12929 | add_mixer(spec, spec->kctls.list); |
12544 | 12930 | ||
12545 | /* create a beep mixer control if the pin 0x1d isn't assigned */ | ||
12546 | for (i = 0; i < ARRAY_SIZE(spec->autocfg.input_pins); i++) | ||
12547 | if (spec->autocfg.input_pins[i] == 0x1d) | ||
12548 | break; | ||
12549 | if (i >= ARRAY_SIZE(spec->autocfg.input_pins)) | ||
12550 | add_mixer(spec, alc269_beep_mixer); | ||
12551 | |||
12552 | add_verb(spec, alc269_init_verbs); | 12931 | add_verb(spec, alc269_init_verbs); |
12553 | spec->num_mux_defs = 1; | 12932 | spec->num_mux_defs = 1; |
12554 | spec->input_mux = &spec->private_imux; | 12933 | spec->input_mux = &spec->private_imux[0]; |
12555 | /* set default input source */ | 12934 | /* set default input source */ |
12556 | snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], | 12935 | snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], |
12557 | 0, AC_VERB_SET_CONNECT_SEL, | 12936 | 0, AC_VERB_SET_CONNECT_SEL, |
@@ -12561,10 +12940,9 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
12561 | if (err < 0) | 12940 | if (err < 0) |
12562 | return err; | 12941 | return err; |
12563 | 12942 | ||
12564 | if (!spec->cap_mixer) | 12943 | if (!spec->cap_mixer && !spec->no_analog) |
12565 | set_capture_mixer(spec); | 12944 | set_capture_mixer(spec); |
12566 | 12945 | ||
12567 | store_pin_configs(codec); | ||
12568 | return 1; | 12946 | return 1; |
12569 | } | 12947 | } |
12570 | 12948 | ||
@@ -12600,10 +12978,17 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = { | |||
12600 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), | 12978 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), |
12601 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 12979 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
12602 | ALC269_ASUS_EEEPC_P703), | 12980 | ALC269_ASUS_EEEPC_P703), |
12981 | SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703), | ||
12982 | SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703), | ||
12983 | SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703), | ||
12984 | SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703), | ||
12985 | SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703), | ||
12986 | SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703), | ||
12603 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", | 12987 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", |
12604 | ALC269_ASUS_EEEPC_P901), | 12988 | ALC269_ASUS_EEEPC_P901), |
12605 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", | 12989 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", |
12606 | ALC269_ASUS_EEEPC_P901), | 12990 | ALC269_ASUS_EEEPC_P901), |
12991 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901), | ||
12607 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), | 12992 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), |
12608 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), | 12993 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), |
12609 | {} | 12994 | {} |
@@ -12661,7 +13046,7 @@ static struct alc_config_preset alc269_presets[] = { | |||
12661 | .init_hook = alc269_eeepc_dmic_inithook, | 13046 | .init_hook = alc269_eeepc_dmic_inithook, |
12662 | }, | 13047 | }, |
12663 | [ALC269_FUJITSU] = { | 13048 | [ALC269_FUJITSU] = { |
12664 | .mixers = { alc269_fujitsu_mixer, alc269_beep_mixer }, | 13049 | .mixers = { alc269_fujitsu_mixer }, |
12665 | .cap_mixer = alc269_epc_capture_mixer, | 13050 | .cap_mixer = alc269_epc_capture_mixer, |
12666 | .init_verbs = { alc269_init_verbs, | 13051 | .init_verbs = { alc269_init_verbs, |
12667 | alc269_eeepc_dmic_init_verbs }, | 13052 | alc269_eeepc_dmic_init_verbs }, |
@@ -12726,13 +13111,26 @@ static int patch_alc269(struct hda_codec *codec) | |||
12726 | } | 13111 | } |
12727 | } | 13112 | } |
12728 | 13113 | ||
13114 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
13115 | if (err < 0) { | ||
13116 | alc_free(codec); | ||
13117 | return err; | ||
13118 | } | ||
13119 | |||
12729 | if (board_config != ALC269_AUTO) | 13120 | if (board_config != ALC269_AUTO) |
12730 | setup_preset(spec, &alc269_presets[board_config]); | 13121 | setup_preset(spec, &alc269_presets[board_config]); |
12731 | 13122 | ||
12732 | spec->stream_name_analog = "ALC269 Analog"; | 13123 | spec->stream_name_analog = "ALC269 Analog"; |
12733 | spec->stream_analog_playback = &alc269_pcm_analog_playback; | 13124 | if (codec->subsystem_id == 0x17aa3bf8) { |
12734 | spec->stream_analog_capture = &alc269_pcm_analog_capture; | 13125 | /* Due to a hardware problem on Lenovo Ideadpad, we need to |
12735 | 13126 | * fix the sample rate of analog I/O to 44.1kHz | |
13127 | */ | ||
13128 | spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; | ||
13129 | spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; | ||
13130 | } else { | ||
13131 | spec->stream_analog_playback = &alc269_pcm_analog_playback; | ||
13132 | spec->stream_analog_capture = &alc269_pcm_analog_capture; | ||
13133 | } | ||
12736 | spec->stream_name_digital = "ALC269 Digital"; | 13134 | spec->stream_name_digital = "ALC269 Digital"; |
12737 | spec->stream_digital_playback = &alc269_pcm_digital_playback; | 13135 | spec->stream_digital_playback = &alc269_pcm_digital_playback; |
12738 | spec->stream_digital_capture = &alc269_pcm_digital_capture; | 13136 | spec->stream_digital_capture = &alc269_pcm_digital_capture; |
@@ -12742,6 +13140,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
12742 | spec->capsrc_nids = alc269_capsrc_nids; | 13140 | spec->capsrc_nids = alc269_capsrc_nids; |
12743 | if (!spec->cap_mixer) | 13141 | if (!spec->cap_mixer) |
12744 | set_capture_mixer(spec); | 13142 | set_capture_mixer(spec); |
13143 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | ||
12745 | 13144 | ||
12746 | codec->patch_ops = alc_patch_ops; | 13145 | codec->patch_ops = alc_patch_ops; |
12747 | if (board_config == ALC269_AUTO) | 13146 | if (board_config == ALC269_AUTO) |
@@ -12992,8 +13391,6 @@ static struct snd_kcontrol_new alc861_asus_mixer[] = { | |||
12992 | static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { | 13391 | static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { |
12993 | HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), | 13392 | HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), |
12994 | HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), | 13393 | HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), |
12995 | HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x23, 0x0, HDA_OUTPUT), | ||
12996 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x23, 0x0, HDA_OUTPUT), | ||
12997 | { } | 13394 | { } |
12998 | }; | 13395 | }; |
12999 | 13396 | ||
@@ -13467,7 +13864,7 @@ static int alc861_auto_create_hp_ctls(struct alc_spec *spec, hda_nid_t pin) | |||
13467 | static int alc861_auto_create_analog_input_ctls(struct alc_spec *spec, | 13864 | static int alc861_auto_create_analog_input_ctls(struct alc_spec *spec, |
13468 | const struct auto_pin_cfg *cfg) | 13865 | const struct auto_pin_cfg *cfg) |
13469 | { | 13866 | { |
13470 | struct hda_input_mux *imux = &spec->private_imux; | 13867 | struct hda_input_mux *imux = &spec->private_imux[0]; |
13471 | int i, err, idx, idx1; | 13868 | int i, err, idx, idx1; |
13472 | 13869 | ||
13473 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 13870 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
@@ -13554,12 +13951,8 @@ static void alc861_auto_init_analog_input(struct hda_codec *codec) | |||
13554 | 13951 | ||
13555 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 13952 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
13556 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 13953 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
13557 | if (nid >= 0x0c && nid <= 0x11) { | 13954 | if (nid >= 0x0c && nid <= 0x11) |
13558 | snd_hda_codec_write(codec, nid, 0, | 13955 | alc_set_input_pin(codec, nid, i); |
13559 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
13560 | i <= AUTO_PIN_FRONT_MIC ? | ||
13561 | PIN_VREF80 : PIN_IN); | ||
13562 | } | ||
13563 | } | 13956 | } |
13564 | } | 13957 | } |
13565 | 13958 | ||
@@ -13595,7 +13988,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
13595 | 13988 | ||
13596 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 13989 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
13597 | 13990 | ||
13598 | if (spec->autocfg.dig_out_pin) | 13991 | if (spec->autocfg.dig_outs) |
13599 | spec->multiout.dig_out_nid = ALC861_DIGOUT_NID; | 13992 | spec->multiout.dig_out_nid = ALC861_DIGOUT_NID; |
13600 | 13993 | ||
13601 | if (spec->kctls.list) | 13994 | if (spec->kctls.list) |
@@ -13604,13 +13997,12 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
13604 | add_verb(spec, alc861_auto_init_verbs); | 13997 | add_verb(spec, alc861_auto_init_verbs); |
13605 | 13998 | ||
13606 | spec->num_mux_defs = 1; | 13999 | spec->num_mux_defs = 1; |
13607 | spec->input_mux = &spec->private_imux; | 14000 | spec->input_mux = &spec->private_imux[0]; |
13608 | 14001 | ||
13609 | spec->adc_nids = alc861_adc_nids; | 14002 | spec->adc_nids = alc861_adc_nids; |
13610 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); | 14003 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); |
13611 | set_capture_mixer(spec); | 14004 | set_capture_mixer(spec); |
13612 | 14005 | ||
13613 | store_pin_configs(codec); | ||
13614 | return 1; | 14006 | return 1; |
13615 | } | 14007 | } |
13616 | 14008 | ||
@@ -13819,6 +14211,12 @@ static int patch_alc861(struct hda_codec *codec) | |||
13819 | } | 14211 | } |
13820 | } | 14212 | } |
13821 | 14213 | ||
14214 | err = snd_hda_attach_beep_device(codec, 0x23); | ||
14215 | if (err < 0) { | ||
14216 | alc_free(codec); | ||
14217 | return err; | ||
14218 | } | ||
14219 | |||
13822 | if (board_config != ALC861_AUTO) | 14220 | if (board_config != ALC861_AUTO) |
13823 | setup_preset(spec, &alc861_presets[board_config]); | 14221 | setup_preset(spec, &alc861_presets[board_config]); |
13824 | 14222 | ||
@@ -13830,6 +14228,8 @@ static int patch_alc861(struct hda_codec *codec) | |||
13830 | spec->stream_digital_playback = &alc861_pcm_digital_playback; | 14228 | spec->stream_digital_playback = &alc861_pcm_digital_playback; |
13831 | spec->stream_digital_capture = &alc861_pcm_digital_capture; | 14229 | spec->stream_digital_capture = &alc861_pcm_digital_capture; |
13832 | 14230 | ||
14231 | set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); | ||
14232 | |||
13833 | spec->vmaster_nid = 0x03; | 14233 | spec->vmaster_nid = 0x03; |
13834 | 14234 | ||
13835 | codec->patch_ops = alc_patch_ops; | 14235 | codec->patch_ops = alc_patch_ops; |
@@ -13986,9 +14386,6 @@ static struct snd_kcontrol_new alc861vd_6st_mixer[] = { | |||
13986 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 14386 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
13987 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 14387 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
13988 | 14388 | ||
13989 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
13990 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
13991 | |||
13992 | { } /* end */ | 14389 | { } /* end */ |
13993 | }; | 14390 | }; |
13994 | 14391 | ||
@@ -14012,9 +14409,6 @@ static struct snd_kcontrol_new alc861vd_3st_mixer[] = { | |||
14012 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 14409 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
14013 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 14410 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
14014 | 14411 | ||
14015 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
14016 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
14017 | |||
14018 | { } /* end */ | 14412 | { } /* end */ |
14019 | }; | 14413 | }; |
14020 | 14414 | ||
@@ -14053,8 +14447,6 @@ static struct snd_kcontrol_new alc861vd_dallas_mixer[] = { | |||
14053 | HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), | 14447 | HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), |
14054 | HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 14448 | HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
14055 | HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 14449 | HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
14056 | HDA_CODEC_VOLUME("PC Beep Volume", 0x0b, 0x05, HDA_INPUT), | ||
14057 | HDA_CODEC_MUTE("PC Beep Switch", 0x0b, 0x05, HDA_INPUT), | ||
14058 | { } /* end */ | 14450 | { } /* end */ |
14059 | }; | 14451 | }; |
14060 | 14452 | ||
@@ -14365,9 +14757,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | |||
14365 | SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), | 14757 | SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), |
14366 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), | 14758 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), |
14367 | SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), | 14759 | SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), |
14368 | SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo", ALC861VD_LENOVO), | 14760 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO), |
14369 | SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo 3000 C200", ALC861VD_LENOVO), | ||
14370 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 N200", ALC861VD_LENOVO), | ||
14371 | SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG), | 14761 | SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG), |
14372 | {} | 14762 | {} |
14373 | }; | 14763 | }; |
@@ -14529,11 +14919,9 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
14529 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 14919 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
14530 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 14920 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
14531 | if (alc861vd_is_input_pin(nid)) { | 14921 | if (alc861vd_is_input_pin(nid)) { |
14532 | snd_hda_codec_write(codec, nid, 0, | 14922 | alc_set_input_pin(codec, nid, i); |
14533 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 14923 | if (nid != ALC861VD_PIN_CD_NID && |
14534 | i <= AUTO_PIN_FRONT_MIC ? | 14924 | (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) |
14535 | PIN_VREF80 : PIN_IN); | ||
14536 | if (nid != ALC861VD_PIN_CD_NID) | ||
14537 | snd_hda_codec_write(codec, nid, 0, | 14925 | snd_hda_codec_write(codec, nid, 0, |
14538 | AC_VERB_SET_AMP_GAIN_MUTE, | 14926 | AC_VERB_SET_AMP_GAIN_MUTE, |
14539 | AMP_OUT_MUTE); | 14927 | AMP_OUT_MUTE); |
@@ -14699,7 +15087,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) | |||
14699 | 15087 | ||
14700 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 15088 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
14701 | 15089 | ||
14702 | if (spec->autocfg.dig_out_pin) | 15090 | if (spec->autocfg.dig_outs) |
14703 | spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID; | 15091 | spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID; |
14704 | 15092 | ||
14705 | if (spec->kctls.list) | 15093 | if (spec->kctls.list) |
@@ -14708,13 +15096,12 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) | |||
14708 | add_verb(spec, alc861vd_volume_init_verbs); | 15096 | add_verb(spec, alc861vd_volume_init_verbs); |
14709 | 15097 | ||
14710 | spec->num_mux_defs = 1; | 15098 | spec->num_mux_defs = 1; |
14711 | spec->input_mux = &spec->private_imux; | 15099 | spec->input_mux = &spec->private_imux[0]; |
14712 | 15100 | ||
14713 | err = alc_auto_add_mic_boost(codec); | 15101 | err = alc_auto_add_mic_boost(codec); |
14714 | if (err < 0) | 15102 | if (err < 0) |
14715 | return err; | 15103 | return err; |
14716 | 15104 | ||
14717 | store_pin_configs(codec); | ||
14718 | return 1; | 15105 | return 1; |
14719 | } | 15106 | } |
14720 | 15107 | ||
@@ -14765,6 +15152,12 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
14765 | } | 15152 | } |
14766 | } | 15153 | } |
14767 | 15154 | ||
15155 | err = snd_hda_attach_beep_device(codec, 0x23); | ||
15156 | if (err < 0) { | ||
15157 | alc_free(codec); | ||
15158 | return err; | ||
15159 | } | ||
15160 | |||
14768 | if (board_config != ALC861VD_AUTO) | 15161 | if (board_config != ALC861VD_AUTO) |
14769 | setup_preset(spec, &alc861vd_presets[board_config]); | 15162 | setup_preset(spec, &alc861vd_presets[board_config]); |
14770 | 15163 | ||
@@ -14787,9 +15180,10 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
14787 | spec->adc_nids = alc861vd_adc_nids; | 15180 | spec->adc_nids = alc861vd_adc_nids; |
14788 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); | 15181 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); |
14789 | spec->capsrc_nids = alc861vd_capsrc_nids; | 15182 | spec->capsrc_nids = alc861vd_capsrc_nids; |
14790 | spec->is_mix_capture = 1; | 15183 | spec->capture_style = CAPT_MIX; |
14791 | 15184 | ||
14792 | set_capture_mixer(spec); | 15185 | set_capture_mixer(spec); |
15186 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
14793 | 15187 | ||
14794 | spec->vmaster_nid = 0x02; | 15188 | spec->vmaster_nid = 0x02; |
14795 | 15189 | ||
@@ -14825,12 +15219,23 @@ static hda_nid_t alc662_dac_nids[4] = { | |||
14825 | 0x02, 0x03, 0x04 | 15219 | 0x02, 0x03, 0x04 |
14826 | }; | 15220 | }; |
14827 | 15221 | ||
15222 | static hda_nid_t alc272_dac_nids[2] = { | ||
15223 | 0x02, 0x03 | ||
15224 | }; | ||
15225 | |||
14828 | static hda_nid_t alc662_adc_nids[1] = { | 15226 | static hda_nid_t alc662_adc_nids[1] = { |
14829 | /* ADC1-2 */ | 15227 | /* ADC1-2 */ |
14830 | 0x09, | 15228 | 0x09, |
14831 | }; | 15229 | }; |
14832 | 15230 | ||
15231 | static hda_nid_t alc272_adc_nids[1] = { | ||
15232 | /* ADC1-2 */ | ||
15233 | 0x08, | ||
15234 | }; | ||
15235 | |||
14833 | static hda_nid_t alc662_capsrc_nids[1] = { 0x22 }; | 15236 | static hda_nid_t alc662_capsrc_nids[1] = { 0x22 }; |
15237 | static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; | ||
15238 | |||
14834 | 15239 | ||
14835 | /* input MUX */ | 15240 | /* input MUX */ |
14836 | /* FIXME: should be a matrix-type input source selection */ | 15241 | /* FIXME: should be a matrix-type input source selection */ |
@@ -14978,8 +15383,6 @@ static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = { | |||
14978 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 15383 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
14979 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 15384 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
14980 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 15385 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
14981 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
14982 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
14983 | { } /* end */ | 15386 | { } /* end */ |
14984 | }; | 15387 | }; |
14985 | 15388 | ||
@@ -15001,8 +15404,6 @@ static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = { | |||
15001 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 15404 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
15002 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | 15405 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
15003 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | 15406 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
15004 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
15005 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
15006 | { } /* end */ | 15407 | { } /* end */ |
15007 | }; | 15408 | }; |
15008 | 15409 | ||
@@ -15260,14 +15661,7 @@ static struct hda_verb alc662_init_verbs[] = { | |||
15260 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | 15661 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ |
15261 | /* Input mixer */ | 15662 | /* Input mixer */ |
15262 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 15663 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
15263 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
15264 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, | ||
15265 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, | ||
15266 | |||
15267 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 15664 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
15268 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
15269 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, | ||
15270 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, | ||
15271 | 15665 | ||
15272 | /* always trun on EAPD */ | 15666 | /* always trun on EAPD */ |
15273 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | 15667 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, |
@@ -15462,12 +15856,48 @@ static struct hda_verb alc662_ecs_init_verbs[] = { | |||
15462 | {} | 15856 | {} |
15463 | }; | 15857 | }; |
15464 | 15858 | ||
15859 | static struct hda_verb alc272_dell_zm1_init_verbs[] = { | ||
15860 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15861 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15862 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15863 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15864 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
15865 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
15866 | {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ | ||
15867 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
15868 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, | ||
15869 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, | ||
15870 | {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
15871 | {} | ||
15872 | }; | ||
15873 | |||
15874 | static struct hda_verb alc272_dell_init_verbs[] = { | ||
15875 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15876 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15877 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15878 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
15879 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
15880 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
15881 | {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ | ||
15882 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
15883 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, | ||
15884 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, | ||
15885 | {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
15886 | {} | ||
15887 | }; | ||
15888 | |||
15465 | static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { | 15889 | static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { |
15466 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), | 15890 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), |
15467 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), | 15891 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), |
15468 | { } /* end */ | 15892 | { } /* end */ |
15469 | }; | 15893 | }; |
15470 | 15894 | ||
15895 | static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { | ||
15896 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), | ||
15897 | HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), | ||
15898 | { } /* end */ | ||
15899 | }; | ||
15900 | |||
15471 | static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | 15901 | static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) |
15472 | { | 15902 | { |
15473 | unsigned int present; | 15903 | unsigned int present; |
@@ -15978,56 +16408,68 @@ static const char *alc662_models[ALC662_MODEL_LAST] = { | |||
15978 | }; | 16408 | }; |
15979 | 16409 | ||
15980 | static struct snd_pci_quirk alc662_cfg_tbl[] = { | 16410 | static struct snd_pci_quirk alc662_cfg_tbl[] = { |
15981 | SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA), | 16411 | SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), |
15982 | SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V), | 16412 | SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL), |
15983 | SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG), | 16413 | SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), |
15984 | SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701), | ||
15985 | SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20), | ||
15986 | SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), | ||
15987 | SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1), | ||
15988 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), | 16414 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), |
15989 | SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1), | 16415 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), |
15990 | SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1), | 16416 | SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), |
15991 | SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1), | ||
15992 | SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), | 16417 | SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), |
16418 | SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), | ||
15993 | SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1), | 16419 | SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1), |
15994 | SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1), | ||
15995 | SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1), | ||
15996 | SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2), | ||
15997 | SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2), | 16420 | SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2), |
15998 | SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2), | 16421 | SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2), |
15999 | SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2), | 16422 | SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2), |
16423 | SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6), | ||
16424 | SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), | ||
16425 | SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2), | ||
16426 | SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3), | ||
16427 | SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA), | ||
16428 | SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2), | ||
16000 | SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2), | 16429 | SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2), |
16001 | SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), | 16430 | SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5), |
16002 | SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2), | 16431 | SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6), |
16432 | SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2), | ||
16433 | SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1), | ||
16003 | SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2), | 16434 | SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2), |
16004 | SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2), | 16435 | SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2), |
16005 | SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2), | 16436 | SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA), |
16006 | SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2), | 16437 | /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/ |
16007 | SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2), | ||
16008 | SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), | 16438 | SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), |
16009 | SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), | ||
16010 | SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3), | ||
16011 | SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), | 16439 | SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), |
16012 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), | 16440 | SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), |
16441 | SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), | ||
16442 | SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), | ||
16443 | SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), | ||
16444 | SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2), | ||
16445 | SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2), | ||
16446 | SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1), | ||
16447 | SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1), | ||
16448 | SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3), | ||
16449 | SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1), | ||
16450 | SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1), | ||
16451 | SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V), | ||
16452 | /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/ | ||
16453 | SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1), | ||
16454 | SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2), | ||
16455 | SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA), | ||
16456 | SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1), | ||
16013 | SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4), | 16457 | SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4), |
16014 | SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5), | 16458 | SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG), |
16015 | SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6), | 16459 | SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701), |
16016 | SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6), | 16460 | SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20), |
16017 | SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), | 16461 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), |
16018 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", | 16462 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", |
16019 | ALC662_3ST_6ch_DIG), | 16463 | ALC662_3ST_6ch_DIG), |
16020 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), | ||
16021 | SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), | ||
16022 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), | ||
16023 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", | 16464 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", |
16024 | ALC662_3ST_6ch_DIG), | 16465 | ALC662_3ST_6ch_DIG), |
16025 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), | 16466 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), |
16467 | SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), | ||
16468 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), | ||
16026 | SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", | 16469 | SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", |
16027 | ALC662_3ST_6ch_DIG), | 16470 | ALC662_3ST_6ch_DIG), |
16028 | SND_PCI_QUIRK(0x1854, 0x2000, "ASUS H13-2000", ALC663_ASUS_H13), | 16471 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", |
16029 | SND_PCI_QUIRK(0x1854, 0x2001, "ASUS H13-2001", ALC663_ASUS_H13), | 16472 | ALC663_ASUS_H13), |
16030 | SND_PCI_QUIRK(0x1854, 0x2002, "ASUS H13-2002", ALC663_ASUS_H13), | ||
16031 | {} | 16473 | {} |
16032 | }; | 16474 | }; |
16033 | 16475 | ||
@@ -16260,6 +16702,36 @@ static struct alc_config_preset alc662_presets[] = { | |||
16260 | .unsol_event = alc663_mode6_unsol_event, | 16702 | .unsol_event = alc663_mode6_unsol_event, |
16261 | .init_hook = alc663_mode6_inithook, | 16703 | .init_hook = alc663_mode6_inithook, |
16262 | }, | 16704 | }, |
16705 | [ALC272_DELL] = { | ||
16706 | .mixers = { alc663_m51va_mixer }, | ||
16707 | .cap_mixer = alc272_auto_capture_mixer, | ||
16708 | .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs }, | ||
16709 | .num_dacs = ARRAY_SIZE(alc272_dac_nids), | ||
16710 | .dac_nids = alc662_dac_nids, | ||
16711 | .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), | ||
16712 | .adc_nids = alc272_adc_nids, | ||
16713 | .num_adc_nids = ARRAY_SIZE(alc272_adc_nids), | ||
16714 | .capsrc_nids = alc272_capsrc_nids, | ||
16715 | .channel_mode = alc662_3ST_2ch_modes, | ||
16716 | .input_mux = &alc663_m51va_capture_source, | ||
16717 | .unsol_event = alc663_m51va_unsol_event, | ||
16718 | .init_hook = alc663_m51va_inithook, | ||
16719 | }, | ||
16720 | [ALC272_DELL_ZM1] = { | ||
16721 | .mixers = { alc663_m51va_mixer }, | ||
16722 | .cap_mixer = alc662_auto_capture_mixer, | ||
16723 | .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs }, | ||
16724 | .num_dacs = ARRAY_SIZE(alc272_dac_nids), | ||
16725 | .dac_nids = alc662_dac_nids, | ||
16726 | .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), | ||
16727 | .adc_nids = alc662_adc_nids, | ||
16728 | .num_adc_nids = ARRAY_SIZE(alc662_adc_nids), | ||
16729 | .capsrc_nids = alc662_capsrc_nids, | ||
16730 | .channel_mode = alc662_3ST_2ch_modes, | ||
16731 | .input_mux = &alc663_m51va_capture_source, | ||
16732 | .unsol_event = alc663_m51va_unsol_event, | ||
16733 | .init_hook = alc663_m51va_inithook, | ||
16734 | }, | ||
16263 | }; | 16735 | }; |
16264 | 16736 | ||
16265 | 16737 | ||
@@ -16347,7 +16819,7 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, | |||
16347 | 16819 | ||
16348 | if (alc880_is_fixed_pin(pin)) { | 16820 | if (alc880_is_fixed_pin(pin)) { |
16349 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); | 16821 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); |
16350 | /* printk("DAC nid=%x\n",nid); */ | 16822 | /* printk(KERN_DEBUG "DAC nid=%x\n",nid); */ |
16351 | /* specify the DAC as the extra output */ | 16823 | /* specify the DAC as the extra output */ |
16352 | if (!spec->multiout.hp_nid) | 16824 | if (!spec->multiout.hp_nid) |
16353 | spec->multiout.hp_nid = nid; | 16825 | spec->multiout.hp_nid = nid; |
@@ -16377,26 +16849,58 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, | |||
16377 | return 0; | 16849 | return 0; |
16378 | } | 16850 | } |
16379 | 16851 | ||
16852 | /* return the index of the src widget from the connection list of the nid. | ||
16853 | * return -1 if not found | ||
16854 | */ | ||
16855 | static int alc662_input_pin_idx(struct hda_codec *codec, hda_nid_t nid, | ||
16856 | hda_nid_t src) | ||
16857 | { | ||
16858 | hda_nid_t conn_list[HDA_MAX_CONNECTIONS]; | ||
16859 | int i, conns; | ||
16860 | |||
16861 | conns = snd_hda_get_connections(codec, nid, conn_list, | ||
16862 | ARRAY_SIZE(conn_list)); | ||
16863 | if (conns < 0) | ||
16864 | return -1; | ||
16865 | for (i = 0; i < conns; i++) | ||
16866 | if (conn_list[i] == src) | ||
16867 | return i; | ||
16868 | return -1; | ||
16869 | } | ||
16870 | |||
16871 | static int alc662_is_input_pin(struct hda_codec *codec, hda_nid_t nid) | ||
16872 | { | ||
16873 | unsigned int pincap = snd_hda_query_pin_caps(codec, nid); | ||
16874 | return (pincap & AC_PINCAP_IN) != 0; | ||
16875 | } | ||
16876 | |||
16380 | /* create playback/capture controls for input pins */ | 16877 | /* create playback/capture controls for input pins */ |
16381 | static int alc662_auto_create_analog_input_ctls(struct alc_spec *spec, | 16878 | static int alc662_auto_create_analog_input_ctls(struct hda_codec *codec, |
16382 | const struct auto_pin_cfg *cfg) | 16879 | const struct auto_pin_cfg *cfg) |
16383 | { | 16880 | { |
16384 | struct hda_input_mux *imux = &spec->private_imux; | 16881 | struct alc_spec *spec = codec->spec; |
16882 | struct hda_input_mux *imux = &spec->private_imux[0]; | ||
16385 | int i, err, idx; | 16883 | int i, err, idx; |
16386 | 16884 | ||
16387 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 16885 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
16388 | if (alc880_is_input_pin(cfg->input_pins[i])) { | 16886 | if (alc662_is_input_pin(codec, cfg->input_pins[i])) { |
16389 | idx = alc880_input_pin_idx(cfg->input_pins[i]); | 16887 | idx = alc662_input_pin_idx(codec, 0x0b, |
16390 | err = new_analog_input(spec, cfg->input_pins[i], | 16888 | cfg->input_pins[i]); |
16391 | auto_pin_cfg_labels[i], | 16889 | if (idx >= 0) { |
16392 | idx, 0x0b); | 16890 | err = new_analog_input(spec, cfg->input_pins[i], |
16393 | if (err < 0) | 16891 | auto_pin_cfg_labels[i], |
16394 | return err; | 16892 | idx, 0x0b); |
16395 | imux->items[imux->num_items].label = | 16893 | if (err < 0) |
16396 | auto_pin_cfg_labels[i]; | 16894 | return err; |
16397 | imux->items[imux->num_items].index = | 16895 | } |
16398 | alc880_input_pin_idx(cfg->input_pins[i]); | 16896 | idx = alc662_input_pin_idx(codec, 0x22, |
16399 | imux->num_items++; | 16897 | cfg->input_pins[i]); |
16898 | if (idx >= 0) { | ||
16899 | imux->items[imux->num_items].label = | ||
16900 | auto_pin_cfg_labels[i]; | ||
16901 | imux->items[imux->num_items].index = idx; | ||
16902 | imux->num_items++; | ||
16903 | } | ||
16400 | } | 16904 | } |
16401 | } | 16905 | } |
16402 | return 0; | 16906 | return 0; |
@@ -16446,7 +16950,6 @@ static void alc662_auto_init_hp_out(struct hda_codec *codec) | |||
16446 | alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); | 16950 | alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); |
16447 | } | 16951 | } |
16448 | 16952 | ||
16449 | #define alc662_is_input_pin(nid) alc880_is_input_pin(nid) | ||
16450 | #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID | 16953 | #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID |
16451 | 16954 | ||
16452 | static void alc662_auto_init_analog_input(struct hda_codec *codec) | 16955 | static void alc662_auto_init_analog_input(struct hda_codec *codec) |
@@ -16456,12 +16959,10 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec) | |||
16456 | 16959 | ||
16457 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 16960 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
16458 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 16961 | hda_nid_t nid = spec->autocfg.input_pins[i]; |
16459 | if (alc662_is_input_pin(nid)) { | 16962 | if (alc662_is_input_pin(codec, nid)) { |
16460 | snd_hda_codec_write(codec, nid, 0, | 16963 | alc_set_input_pin(codec, nid, i); |
16461 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 16964 | if (nid != ALC662_PIN_CD_NID && |
16462 | (i <= AUTO_PIN_FRONT_MIC ? | 16965 | (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) |
16463 | PIN_VREF80 : PIN_IN)); | ||
16464 | if (nid != ALC662_PIN_CD_NID) | ||
16465 | snd_hda_codec_write(codec, nid, 0, | 16966 | snd_hda_codec_write(codec, nid, 0, |
16466 | AC_VERB_SET_AMP_GAIN_MUTE, | 16967 | AC_VERB_SET_AMP_GAIN_MUTE, |
16467 | AMP_OUT_MUTE); | 16968 | AMP_OUT_MUTE); |
@@ -16499,20 +17000,20 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
16499 | "Headphone"); | 17000 | "Headphone"); |
16500 | if (err < 0) | 17001 | if (err < 0) |
16501 | return err; | 17002 | return err; |
16502 | err = alc662_auto_create_analog_input_ctls(spec, &spec->autocfg); | 17003 | err = alc662_auto_create_analog_input_ctls(codec, &spec->autocfg); |
16503 | if (err < 0) | 17004 | if (err < 0) |
16504 | return err; | 17005 | return err; |
16505 | 17006 | ||
16506 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 17007 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
16507 | 17008 | ||
16508 | if (spec->autocfg.dig_out_pin) | 17009 | if (spec->autocfg.dig_outs) |
16509 | spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; | 17010 | spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; |
16510 | 17011 | ||
16511 | if (spec->kctls.list) | 17012 | if (spec->kctls.list) |
16512 | add_mixer(spec, spec->kctls.list); | 17013 | add_mixer(spec, spec->kctls.list); |
16513 | 17014 | ||
16514 | spec->num_mux_defs = 1; | 17015 | spec->num_mux_defs = 1; |
16515 | spec->input_mux = &spec->private_imux; | 17016 | spec->input_mux = &spec->private_imux[0]; |
16516 | 17017 | ||
16517 | add_verb(spec, alc662_auto_init_verbs); | 17018 | add_verb(spec, alc662_auto_init_verbs); |
16518 | if (codec->vendor_id == 0x10ec0663) | 17019 | if (codec->vendor_id == 0x10ec0663) |
@@ -16522,7 +17023,6 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
16522 | if (err < 0) | 17023 | if (err < 0) |
16523 | return err; | 17024 | return err; |
16524 | 17025 | ||
16525 | store_pin_configs(codec); | ||
16526 | return 1; | 17026 | return 1; |
16527 | } | 17027 | } |
16528 | 17028 | ||
@@ -16574,6 +17074,12 @@ static int patch_alc662(struct hda_codec *codec) | |||
16574 | } | 17074 | } |
16575 | } | 17075 | } |
16576 | 17076 | ||
17077 | err = snd_hda_attach_beep_device(codec, 0x1); | ||
17078 | if (err < 0) { | ||
17079 | alc_free(codec); | ||
17080 | return err; | ||
17081 | } | ||
17082 | |||
16577 | if (board_config != ALC662_AUTO) | 17083 | if (board_config != ALC662_AUTO) |
16578 | setup_preset(spec, &alc662_presets[board_config]); | 17084 | setup_preset(spec, &alc662_presets[board_config]); |
16579 | 17085 | ||
@@ -16597,10 +17103,14 @@ static int patch_alc662(struct hda_codec *codec) | |||
16597 | spec->adc_nids = alc662_adc_nids; | 17103 | spec->adc_nids = alc662_adc_nids; |
16598 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); | 17104 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); |
16599 | spec->capsrc_nids = alc662_capsrc_nids; | 17105 | spec->capsrc_nids = alc662_capsrc_nids; |
16600 | spec->is_mix_capture = 1; | 17106 | spec->capture_style = CAPT_MIX; |
16601 | 17107 | ||
16602 | if (!spec->cap_mixer) | 17108 | if (!spec->cap_mixer) |
16603 | set_capture_mixer(spec); | 17109 | set_capture_mixer(spec); |
17110 | if (codec->vendor_id == 0x10ec0662) | ||
17111 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | ||
17112 | else | ||
17113 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | ||
16604 | 17114 | ||
16605 | spec->vmaster_nid = 0x02; | 17115 | spec->vmaster_nid = 0x02; |
16606 | 17116 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 35b83dc6e19e..917bc5d3ac2c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -43,6 +43,7 @@ enum { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | enum { | 45 | enum { |
46 | STAC_AUTO, | ||
46 | STAC_REF, | 47 | STAC_REF, |
47 | STAC_9200_OQO, | 48 | STAC_9200_OQO, |
48 | STAC_9200_DELL_D21, | 49 | STAC_9200_DELL_D21, |
@@ -55,20 +56,24 @@ enum { | |||
55 | STAC_9200_DELL_M25, | 56 | STAC_9200_DELL_M25, |
56 | STAC_9200_DELL_M26, | 57 | STAC_9200_DELL_M26, |
57 | STAC_9200_DELL_M27, | 58 | STAC_9200_DELL_M27, |
58 | STAC_9200_GATEWAY, | 59 | STAC_9200_M4, |
60 | STAC_9200_M4_2, | ||
59 | STAC_9200_PANASONIC, | 61 | STAC_9200_PANASONIC, |
60 | STAC_9200_MODELS | 62 | STAC_9200_MODELS |
61 | }; | 63 | }; |
62 | 64 | ||
63 | enum { | 65 | enum { |
66 | STAC_9205_AUTO, | ||
64 | STAC_9205_REF, | 67 | STAC_9205_REF, |
65 | STAC_9205_DELL_M42, | 68 | STAC_9205_DELL_M42, |
66 | STAC_9205_DELL_M43, | 69 | STAC_9205_DELL_M43, |
67 | STAC_9205_DELL_M44, | 70 | STAC_9205_DELL_M44, |
71 | STAC_9205_EAPD, | ||
68 | STAC_9205_MODELS | 72 | STAC_9205_MODELS |
69 | }; | 73 | }; |
70 | 74 | ||
71 | enum { | 75 | enum { |
76 | STAC_92HD73XX_AUTO, | ||
72 | STAC_92HD73XX_NO_JD, /* no jack-detection */ | 77 | STAC_92HD73XX_NO_JD, /* no jack-detection */ |
73 | STAC_92HD73XX_REF, | 78 | STAC_92HD73XX_REF, |
74 | STAC_DELL_M6_AMIC, | 79 | STAC_DELL_M6_AMIC, |
@@ -79,28 +84,40 @@ enum { | |||
79 | }; | 84 | }; |
80 | 85 | ||
81 | enum { | 86 | enum { |
87 | STAC_92HD83XXX_AUTO, | ||
82 | STAC_92HD83XXX_REF, | 88 | STAC_92HD83XXX_REF, |
89 | STAC_92HD83XXX_PWR_REF, | ||
90 | STAC_DELL_S14, | ||
83 | STAC_92HD83XXX_MODELS | 91 | STAC_92HD83XXX_MODELS |
84 | }; | 92 | }; |
85 | 93 | ||
86 | enum { | 94 | enum { |
95 | STAC_92HD71BXX_AUTO, | ||
87 | STAC_92HD71BXX_REF, | 96 | STAC_92HD71BXX_REF, |
88 | STAC_DELL_M4_1, | 97 | STAC_DELL_M4_1, |
89 | STAC_DELL_M4_2, | 98 | STAC_DELL_M4_2, |
90 | STAC_DELL_M4_3, | 99 | STAC_DELL_M4_3, |
91 | STAC_HP_M4, | 100 | STAC_HP_M4, |
101 | STAC_HP_DV5, | ||
102 | STAC_HP_HDX, | ||
92 | STAC_92HD71BXX_MODELS | 103 | STAC_92HD71BXX_MODELS |
93 | }; | 104 | }; |
94 | 105 | ||
95 | enum { | 106 | enum { |
107 | STAC_925x_AUTO, | ||
96 | STAC_925x_REF, | 108 | STAC_925x_REF, |
109 | STAC_M1, | ||
110 | STAC_M1_2, | ||
111 | STAC_M2, | ||
97 | STAC_M2_2, | 112 | STAC_M2_2, |
98 | STAC_MA6, | 113 | STAC_M3, |
99 | STAC_PA6, | 114 | STAC_M5, |
115 | STAC_M6, | ||
100 | STAC_925x_MODELS | 116 | STAC_925x_MODELS |
101 | }; | 117 | }; |
102 | 118 | ||
103 | enum { | 119 | enum { |
120 | STAC_922X_AUTO, | ||
104 | STAC_D945_REF, | 121 | STAC_D945_REF, |
105 | STAC_D945GTP3, | 122 | STAC_D945GTP3, |
106 | STAC_D945GTP5, | 123 | STAC_D945GTP5, |
@@ -128,6 +145,7 @@ enum { | |||
128 | }; | 145 | }; |
129 | 146 | ||
130 | enum { | 147 | enum { |
148 | STAC_927X_AUTO, | ||
131 | STAC_D965_REF_NO_JD, /* no jack-detection */ | 149 | STAC_D965_REF_NO_JD, /* no jack-detection */ |
132 | STAC_D965_REF, | 150 | STAC_D965_REF, |
133 | STAC_D965_3ST, | 151 | STAC_D965_3ST, |
@@ -137,6 +155,12 @@ enum { | |||
137 | STAC_927X_MODELS | 155 | STAC_927X_MODELS |
138 | }; | 156 | }; |
139 | 157 | ||
158 | enum { | ||
159 | STAC_9872_AUTO, | ||
160 | STAC_9872_VAIO, | ||
161 | STAC_9872_MODELS | ||
162 | }; | ||
163 | |||
140 | struct sigmatel_event { | 164 | struct sigmatel_event { |
141 | hda_nid_t nid; | 165 | hda_nid_t nid; |
142 | unsigned char type; | 166 | unsigned char type; |
@@ -160,6 +184,7 @@ struct sigmatel_spec { | |||
160 | unsigned int alt_switch: 1; | 184 | unsigned int alt_switch: 1; |
161 | unsigned int hp_detect: 1; | 185 | unsigned int hp_detect: 1; |
162 | unsigned int spdif_mute: 1; | 186 | unsigned int spdif_mute: 1; |
187 | unsigned int check_volume_offset:1; | ||
163 | 188 | ||
164 | /* gpio lines */ | 189 | /* gpio lines */ |
165 | unsigned int eapd_mask; | 190 | unsigned int eapd_mask; |
@@ -172,6 +197,7 @@ struct sigmatel_spec { | |||
172 | unsigned int stream_delay; | 197 | unsigned int stream_delay; |
173 | 198 | ||
174 | /* analog loopback */ | 199 | /* analog loopback */ |
200 | struct snd_kcontrol_new *aloopback_ctl; | ||
175 | unsigned char aloopback_mask; | 201 | unsigned char aloopback_mask; |
176 | unsigned char aloopback_shift; | 202 | unsigned char aloopback_shift; |
177 | 203 | ||
@@ -196,6 +222,8 @@ struct sigmatel_spec { | |||
196 | hda_nid_t hp_dacs[5]; | 222 | hda_nid_t hp_dacs[5]; |
197 | hda_nid_t speaker_dacs[5]; | 223 | hda_nid_t speaker_dacs[5]; |
198 | 224 | ||
225 | int volume_offset; | ||
226 | |||
199 | /* capture */ | 227 | /* capture */ |
200 | hda_nid_t *adc_nids; | 228 | hda_nid_t *adc_nids; |
201 | unsigned int num_adcs; | 229 | unsigned int num_adcs; |
@@ -217,7 +245,6 @@ struct sigmatel_spec { | |||
217 | /* pin widgets */ | 245 | /* pin widgets */ |
218 | hda_nid_t *pin_nids; | 246 | hda_nid_t *pin_nids; |
219 | unsigned int num_pins; | 247 | unsigned int num_pins; |
220 | unsigned int *pin_configs; | ||
221 | 248 | ||
222 | /* codec specific stuff */ | 249 | /* codec specific stuff */ |
223 | struct hda_verb *init; | 250 | struct hda_verb *init; |
@@ -328,7 +355,11 @@ static hda_nid_t stac92hd83xxx_slave_dig_outs[2] = { | |||
328 | }; | 355 | }; |
329 | 356 | ||
330 | static unsigned int stac92hd83xxx_pwr_mapping[4] = { | 357 | static unsigned int stac92hd83xxx_pwr_mapping[4] = { |
331 | 0x03, 0x0c, 0x10, 0x40, | 358 | 0x03, 0x0c, 0x20, 0x40, |
359 | }; | ||
360 | |||
361 | static hda_nid_t stac92hd83xxx_amp_nids[1] = { | ||
362 | 0xc, | ||
332 | }; | 363 | }; |
333 | 364 | ||
334 | static hda_nid_t stac92hd71bxx_pwr_nids[3] = { | 365 | static hda_nid_t stac92hd71bxx_pwr_nids[3] = { |
@@ -389,6 +420,10 @@ static hda_nid_t stac922x_mux_nids[2] = { | |||
389 | 0x12, 0x13, | 420 | 0x12, 0x13, |
390 | }; | 421 | }; |
391 | 422 | ||
423 | static hda_nid_t stac927x_slave_dig_outs[2] = { | ||
424 | 0x1f, 0, | ||
425 | }; | ||
426 | |||
392 | static hda_nid_t stac927x_adc_nids[3] = { | 427 | static hda_nid_t stac927x_adc_nids[3] = { |
393 | 0x07, 0x08, 0x09 | 428 | 0x07, 0x08, 0x09 |
394 | }; | 429 | }; |
@@ -461,15 +496,21 @@ static hda_nid_t stac92hd73xx_pin_nids[13] = { | |||
461 | 0x14, 0x22, 0x23 | 496 | 0x14, 0x22, 0x23 |
462 | }; | 497 | }; |
463 | 498 | ||
464 | static hda_nid_t stac92hd83xxx_pin_nids[14] = { | 499 | static hda_nid_t stac92hd83xxx_pin_nids[10] = { |
465 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, | 500 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, |
466 | 0x0f, 0x10, 0x11, 0x12, 0x13, | 501 | 0x0f, 0x10, 0x11, 0x1f, 0x20, |
467 | 0x1d, 0x1e, 0x1f, 0x20 | ||
468 | }; | 502 | }; |
469 | static hda_nid_t stac92hd71bxx_pin_nids[11] = { | 503 | |
504 | #define STAC92HD71BXX_NUM_PINS 13 | ||
505 | static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = { | ||
506 | 0x0a, 0x0b, 0x0c, 0x0d, 0x00, | ||
507 | 0x00, 0x14, 0x18, 0x19, 0x1e, | ||
508 | 0x1f, 0x20, 0x27 | ||
509 | }; | ||
510 | static hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = { | ||
470 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, | 511 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, |
471 | 0x0f, 0x14, 0x18, 0x19, 0x1e, | 512 | 0x0f, 0x14, 0x18, 0x19, 0x1e, |
472 | 0x1f, | 513 | 0x1f, 0x20, 0x27 |
473 | }; | 514 | }; |
474 | 515 | ||
475 | static hda_nid_t stac927x_pin_nids[14] = { | 516 | static hda_nid_t stac927x_pin_nids[14] = { |
@@ -831,13 +872,9 @@ static struct hda_verb stac92hd73xx_10ch_core_init[] = { | |||
831 | }; | 872 | }; |
832 | 873 | ||
833 | static struct hda_verb stac92hd83xxx_core_init[] = { | 874 | static struct hda_verb stac92hd83xxx_core_init[] = { |
834 | /* start of config #1 */ | 875 | { 0xa, AC_VERB_SET_CONNECT_SEL, 0x1}, |
835 | { 0xe, AC_VERB_SET_CONNECT_SEL, 0x3}, | 876 | { 0xb, AC_VERB_SET_CONNECT_SEL, 0x1}, |
836 | 877 | { 0xd, AC_VERB_SET_CONNECT_SEL, 0x0}, | |
837 | /* start of config #2 */ | ||
838 | { 0xa, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
839 | { 0xb, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
840 | { 0xd, AC_VERB_SET_CONNECT_SEL, 0x1}, | ||
841 | 878 | ||
842 | /* power state controls amps */ | 879 | /* power state controls amps */ |
843 | { 0x01, AC_VERB_SET_EAPD, 1 << 2}, | 880 | { 0x01, AC_VERB_SET_EAPD, 1 << 2}, |
@@ -847,26 +884,25 @@ static struct hda_verb stac92hd83xxx_core_init[] = { | |||
847 | static struct hda_verb stac92hd71bxx_core_init[] = { | 884 | static struct hda_verb stac92hd71bxx_core_init[] = { |
848 | /* set master volume and direct control */ | 885 | /* set master volume and direct control */ |
849 | { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 886 | { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, |
850 | /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */ | ||
851 | { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
852 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
853 | { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
854 | {} | 887 | {} |
855 | }; | 888 | }; |
856 | 889 | ||
857 | #define HD_DISABLE_PORTF 2 | 890 | #define HD_DISABLE_PORTF 1 |
858 | static struct hda_verb stac92hd71bxx_analog_core_init[] = { | 891 | static struct hda_verb stac92hd71bxx_analog_core_init[] = { |
859 | /* start of config #1 */ | 892 | /* start of config #1 */ |
860 | 893 | ||
861 | /* connect port 0f to audio mixer */ | 894 | /* connect port 0f to audio mixer */ |
862 | { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2}, | 895 | { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2}, |
863 | /* unmute right and left channels for node 0x0f */ | ||
864 | { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
865 | /* start of config #2 */ | 896 | /* start of config #2 */ |
866 | 897 | ||
867 | /* set master volume and direct control */ | 898 | /* set master volume and direct control */ |
868 | { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 899 | { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, |
869 | /* unmute right and left channels for nodes 0x0a, 0xd */ | 900 | {} |
901 | }; | ||
902 | |||
903 | static struct hda_verb stac92hd71bxx_unmute_core_init[] = { | ||
904 | /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */ | ||
905 | { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
870 | { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 906 | { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
871 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 907 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
872 | {} | 908 | {} |
@@ -875,6 +911,8 @@ static struct hda_verb stac92hd71bxx_analog_core_init[] = { | |||
875 | static struct hda_verb stac925x_core_init[] = { | 911 | static struct hda_verb stac925x_core_init[] = { |
876 | /* set dac0mux for dac converter */ | 912 | /* set dac0mux for dac converter */ |
877 | { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, | 913 | { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, |
914 | /* mute the master volume */ | ||
915 | { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | ||
878 | {} | 916 | {} |
879 | }; | 917 | }; |
880 | 918 | ||
@@ -945,16 +983,6 @@ static struct hda_verb stac9205_core_init[] = { | |||
945 | .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \ | 983 | .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \ |
946 | } | 984 | } |
947 | 985 | ||
948 | #define STAC_INPUT_SOURCE(cnt) \ | ||
949 | { \ | ||
950 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | ||
951 | .name = "Input Source", \ | ||
952 | .count = cnt, \ | ||
953 | .info = stac92xx_mux_enum_info, \ | ||
954 | .get = stac92xx_mux_enum_get, \ | ||
955 | .put = stac92xx_mux_enum_put, \ | ||
956 | } | ||
957 | |||
958 | #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \ | 986 | #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \ |
959 | { \ | 987 | { \ |
960 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | 988 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ |
@@ -969,7 +997,6 @@ static struct hda_verb stac9205_core_init[] = { | |||
969 | static struct snd_kcontrol_new stac9200_mixer[] = { | 997 | static struct snd_kcontrol_new stac9200_mixer[] = { |
970 | HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), | 998 | HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), |
971 | HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT), | 999 | HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT), |
972 | STAC_INPUT_SOURCE(1), | ||
973 | HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT), | 1000 | HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT), |
974 | HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT), | 1001 | HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT), |
975 | { } /* end */ | 1002 | { } /* end */ |
@@ -994,8 +1021,6 @@ static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | |||
994 | HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT), | 1021 | HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT), |
995 | HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT), | 1022 | HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT), |
996 | 1023 | ||
997 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), | ||
998 | |||
999 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1024 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1000 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1025 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1001 | 1026 | ||
@@ -1005,9 +1030,22 @@ static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | |||
1005 | { } /* end */ | 1030 | { } /* end */ |
1006 | }; | 1031 | }; |
1007 | 1032 | ||
1008 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | 1033 | static struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = { |
1034 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), | ||
1035 | {} | ||
1036 | }; | ||
1037 | |||
1038 | static struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = { | ||
1009 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), | 1039 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), |
1040 | {} | ||
1041 | }; | ||
1042 | |||
1043 | static struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = { | ||
1044 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), | ||
1045 | {} | ||
1046 | }; | ||
1010 | 1047 | ||
1048 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | ||
1011 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1049 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1012 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1050 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1013 | 1051 | ||
@@ -1032,8 +1070,6 @@ static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | |||
1032 | }; | 1070 | }; |
1033 | 1071 | ||
1034 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { | 1072 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { |
1035 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), | ||
1036 | |||
1037 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1073 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1038 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1074 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1039 | 1075 | ||
@@ -1085,9 +1121,6 @@ static struct snd_kcontrol_new stac92hd83xxx_mixer[] = { | |||
1085 | }; | 1121 | }; |
1086 | 1122 | ||
1087 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | 1123 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { |
1088 | STAC_INPUT_SOURCE(2), | ||
1089 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), | ||
1090 | |||
1091 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1124 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1092 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1125 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1093 | 1126 | ||
@@ -1113,10 +1146,11 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | |||
1113 | { } /* end */ | 1146 | { } /* end */ |
1114 | }; | 1147 | }; |
1115 | 1148 | ||
1116 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | 1149 | static struct snd_kcontrol_new stac92hd71bxx_loopback[] = { |
1117 | STAC_INPUT_SOURCE(2), | 1150 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2) |
1118 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), | 1151 | }; |
1119 | 1152 | ||
1153 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | ||
1120 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1154 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1121 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1155 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1122 | 1156 | ||
@@ -1126,16 +1160,14 @@ static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | |||
1126 | }; | 1160 | }; |
1127 | 1161 | ||
1128 | static struct snd_kcontrol_new stac925x_mixer[] = { | 1162 | static struct snd_kcontrol_new stac925x_mixer[] = { |
1129 | STAC_INPUT_SOURCE(1), | 1163 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT), |
1164 | HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT), | ||
1130 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT), | 1165 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT), |
1131 | HDA_CODEC_MUTE("Capture Switch", 0x14, 0, HDA_OUTPUT), | 1166 | HDA_CODEC_MUTE("Capture Switch", 0x14, 0, HDA_OUTPUT), |
1132 | { } /* end */ | 1167 | { } /* end */ |
1133 | }; | 1168 | }; |
1134 | 1169 | ||
1135 | static struct snd_kcontrol_new stac9205_mixer[] = { | 1170 | static struct snd_kcontrol_new stac9205_mixer[] = { |
1136 | STAC_INPUT_SOURCE(2), | ||
1137 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), | ||
1138 | |||
1139 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT), | 1171 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT), |
1140 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT), | 1172 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT), |
1141 | 1173 | ||
@@ -1144,9 +1176,13 @@ static struct snd_kcontrol_new stac9205_mixer[] = { | |||
1144 | { } /* end */ | 1176 | { } /* end */ |
1145 | }; | 1177 | }; |
1146 | 1178 | ||
1179 | static struct snd_kcontrol_new stac9205_loopback[] = { | ||
1180 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), | ||
1181 | {} | ||
1182 | }; | ||
1183 | |||
1147 | /* This needs to be generated dynamically based on sequence */ | 1184 | /* This needs to be generated dynamically based on sequence */ |
1148 | static struct snd_kcontrol_new stac922x_mixer[] = { | 1185 | static struct snd_kcontrol_new stac922x_mixer[] = { |
1149 | STAC_INPUT_SOURCE(2), | ||
1150 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT), | 1186 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT), |
1151 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT), | 1187 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT), |
1152 | 1188 | ||
@@ -1157,9 +1193,6 @@ static struct snd_kcontrol_new stac922x_mixer[] = { | |||
1157 | 1193 | ||
1158 | 1194 | ||
1159 | static struct snd_kcontrol_new stac927x_mixer[] = { | 1195 | static struct snd_kcontrol_new stac927x_mixer[] = { |
1160 | STAC_INPUT_SOURCE(3), | ||
1161 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), | ||
1162 | |||
1163 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT), | 1196 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT), |
1164 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT), | 1197 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT), |
1165 | 1198 | ||
@@ -1171,6 +1204,11 @@ static struct snd_kcontrol_new stac927x_mixer[] = { | |||
1171 | { } /* end */ | 1204 | { } /* end */ |
1172 | }; | 1205 | }; |
1173 | 1206 | ||
1207 | static struct snd_kcontrol_new stac927x_loopback[] = { | ||
1208 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), | ||
1209 | {} | ||
1210 | }; | ||
1211 | |||
1174 | static struct snd_kcontrol_new stac_dmux_mixer = { | 1212 | static struct snd_kcontrol_new stac_dmux_mixer = { |
1175 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1213 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
1176 | .name = "Digital Input Source", | 1214 | .name = "Digital Input Source", |
@@ -1196,10 +1234,7 @@ static const char *slave_vols[] = { | |||
1196 | "LFE Playback Volume", | 1234 | "LFE Playback Volume", |
1197 | "Side Playback Volume", | 1235 | "Side Playback Volume", |
1198 | "Headphone Playback Volume", | 1236 | "Headphone Playback Volume", |
1199 | "Headphone Playback Volume", | ||
1200 | "Speaker Playback Volume", | 1237 | "Speaker Playback Volume", |
1201 | "External Speaker Playback Volume", | ||
1202 | "Speaker2 Playback Volume", | ||
1203 | NULL | 1238 | NULL |
1204 | }; | 1239 | }; |
1205 | 1240 | ||
@@ -1210,10 +1245,7 @@ static const char *slave_sws[] = { | |||
1210 | "LFE Playback Switch", | 1245 | "LFE Playback Switch", |
1211 | "Side Playback Switch", | 1246 | "Side Playback Switch", |
1212 | "Headphone Playback Switch", | 1247 | "Headphone Playback Switch", |
1213 | "Headphone Playback Switch", | ||
1214 | "Speaker Playback Switch", | 1248 | "Speaker Playback Switch", |
1215 | "External Speaker Playback Switch", | ||
1216 | "Speaker2 Playback Switch", | ||
1217 | "IEC958 Playback Switch", | 1249 | "IEC958 Playback Switch", |
1218 | NULL | 1250 | NULL |
1219 | }; | 1251 | }; |
@@ -1283,6 +1315,8 @@ static int stac92xx_build_controls(struct hda_codec *codec) | |||
1283 | unsigned int vmaster_tlv[4]; | 1315 | unsigned int vmaster_tlv[4]; |
1284 | snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0], | 1316 | snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0], |
1285 | HDA_OUTPUT, vmaster_tlv); | 1317 | HDA_OUTPUT, vmaster_tlv); |
1318 | /* correct volume offset */ | ||
1319 | vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset; | ||
1286 | err = snd_hda_add_vmaster(codec, "Master Playback Volume", | 1320 | err = snd_hda_add_vmaster(codec, "Master Playback Volume", |
1287 | vmaster_tlv, slave_vols); | 1321 | vmaster_tlv, slave_vols); |
1288 | if (err < 0) | 1322 | if (err < 0) |
@@ -1295,6 +1329,13 @@ static int stac92xx_build_controls(struct hda_codec *codec) | |||
1295 | return err; | 1329 | return err; |
1296 | } | 1330 | } |
1297 | 1331 | ||
1332 | if (spec->aloopback_ctl && | ||
1333 | snd_hda_get_bool_hint(codec, "loopback") == 1) { | ||
1334 | err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl); | ||
1335 | if (err < 0) | ||
1336 | return err; | ||
1337 | } | ||
1338 | |||
1298 | stac92xx_free_kctls(codec); /* no longer needed */ | 1339 | stac92xx_free_kctls(codec); /* no longer needed */ |
1299 | 1340 | ||
1300 | /* create jack input elements */ | 1341 | /* create jack input elements */ |
@@ -1334,7 +1375,16 @@ static unsigned int ref9200_pin_configs[8] = { | |||
1334 | 0x02a19020, 0x01a19021, 0x90100140, 0x01813122, | 1375 | 0x02a19020, 0x01a19021, 0x90100140, 0x01813122, |
1335 | }; | 1376 | }; |
1336 | 1377 | ||
1337 | /* | 1378 | static unsigned int gateway9200_m4_pin_configs[8] = { |
1379 | 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010, | ||
1380 | 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3, | ||
1381 | }; | ||
1382 | static unsigned int gateway9200_m4_2_pin_configs[8] = { | ||
1383 | 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010, | ||
1384 | 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3, | ||
1385 | }; | ||
1386 | |||
1387 | /* | ||
1338 | STAC 9200 pin configs for | 1388 | STAC 9200 pin configs for |
1339 | 102801A8 | 1389 | 102801A8 |
1340 | 102801DE | 1390 | 102801DE |
@@ -1464,10 +1514,13 @@ static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = { | |||
1464 | [STAC_9200_DELL_M25] = dell9200_m25_pin_configs, | 1514 | [STAC_9200_DELL_M25] = dell9200_m25_pin_configs, |
1465 | [STAC_9200_DELL_M26] = dell9200_m26_pin_configs, | 1515 | [STAC_9200_DELL_M26] = dell9200_m26_pin_configs, |
1466 | [STAC_9200_DELL_M27] = dell9200_m27_pin_configs, | 1516 | [STAC_9200_DELL_M27] = dell9200_m27_pin_configs, |
1517 | [STAC_9200_M4] = gateway9200_m4_pin_configs, | ||
1518 | [STAC_9200_M4_2] = gateway9200_m4_2_pin_configs, | ||
1467 | [STAC_9200_PANASONIC] = ref9200_pin_configs, | 1519 | [STAC_9200_PANASONIC] = ref9200_pin_configs, |
1468 | }; | 1520 | }; |
1469 | 1521 | ||
1470 | static const char *stac9200_models[STAC_9200_MODELS] = { | 1522 | static const char *stac9200_models[STAC_9200_MODELS] = { |
1523 | [STAC_AUTO] = "auto", | ||
1471 | [STAC_REF] = "ref", | 1524 | [STAC_REF] = "ref", |
1472 | [STAC_9200_OQO] = "oqo", | 1525 | [STAC_9200_OQO] = "oqo", |
1473 | [STAC_9200_DELL_D21] = "dell-d21", | 1526 | [STAC_9200_DELL_D21] = "dell-d21", |
@@ -1480,7 +1533,8 @@ static const char *stac9200_models[STAC_9200_MODELS] = { | |||
1480 | [STAC_9200_DELL_M25] = "dell-m25", | 1533 | [STAC_9200_DELL_M25] = "dell-m25", |
1481 | [STAC_9200_DELL_M26] = "dell-m26", | 1534 | [STAC_9200_DELL_M26] = "dell-m26", |
1482 | [STAC_9200_DELL_M27] = "dell-m27", | 1535 | [STAC_9200_DELL_M27] = "dell-m27", |
1483 | [STAC_9200_GATEWAY] = "gateway", | 1536 | [STAC_9200_M4] = "gateway-m4", |
1537 | [STAC_9200_M4_2] = "gateway-m4-2", | ||
1484 | [STAC_9200_PANASONIC] = "panasonic", | 1538 | [STAC_9200_PANASONIC] = "panasonic", |
1485 | }; | 1539 | }; |
1486 | 1540 | ||
@@ -1488,6 +1542,8 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = { | |||
1488 | /* SigmaTel reference board */ | 1542 | /* SigmaTel reference board */ |
1489 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1543 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1490 | "DFI LanParty", STAC_REF), | 1544 | "DFI LanParty", STAC_REF), |
1545 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
1546 | "DFI LanParty", STAC_REF), | ||
1491 | /* Dell laptops have BIOS problem */ | 1547 | /* Dell laptops have BIOS problem */ |
1492 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8, | 1548 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8, |
1493 | "unknown Dell", STAC_9200_DELL_D21), | 1549 | "unknown Dell", STAC_9200_DELL_D21), |
@@ -1550,11 +1606,9 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = { | |||
1550 | /* Panasonic */ | 1606 | /* Panasonic */ |
1551 | SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC), | 1607 | SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC), |
1552 | /* Gateway machines needs EAPD to be set on resume */ | 1608 | /* Gateway machines needs EAPD to be set on resume */ |
1553 | SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY), | 1609 | SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4), |
1554 | SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", | 1610 | SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2), |
1555 | STAC_9200_GATEWAY), | 1611 | SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2), |
1556 | SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", | ||
1557 | STAC_9200_GATEWAY), | ||
1558 | /* OQO Mobile */ | 1612 | /* OQO Mobile */ |
1559 | SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO), | 1613 | SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO), |
1560 | {} /* terminator */ | 1614 | {} /* terminator */ |
@@ -1565,44 +1619,87 @@ static unsigned int ref925x_pin_configs[8] = { | |||
1565 | 0x90a70320, 0x02214210, 0x01019020, 0x9033032e, | 1619 | 0x90a70320, 0x02214210, 0x01019020, 0x9033032e, |
1566 | }; | 1620 | }; |
1567 | 1621 | ||
1568 | static unsigned int stac925x_MA6_pin_configs[8] = { | 1622 | static unsigned int stac925xM1_pin_configs[8] = { |
1569 | 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021, | 1623 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, |
1570 | 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e, | 1624 | 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e, |
1571 | }; | 1625 | }; |
1572 | 1626 | ||
1573 | static unsigned int stac925x_PA6_pin_configs[8] = { | 1627 | static unsigned int stac925xM1_2_pin_configs[8] = { |
1574 | 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021, | 1628 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, |
1575 | 0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e, | 1629 | 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e, |
1630 | }; | ||
1631 | |||
1632 | static unsigned int stac925xM2_pin_configs[8] = { | ||
1633 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, | ||
1634 | 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e, | ||
1576 | }; | 1635 | }; |
1577 | 1636 | ||
1578 | static unsigned int stac925xM2_2_pin_configs[8] = { | 1637 | static unsigned int stac925xM2_2_pin_configs[8] = { |
1579 | 0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020, | 1638 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, |
1580 | 0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e, | 1639 | 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e, |
1640 | }; | ||
1641 | |||
1642 | static unsigned int stac925xM3_pin_configs[8] = { | ||
1643 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, | ||
1644 | 0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3, | ||
1645 | }; | ||
1646 | |||
1647 | static unsigned int stac925xM5_pin_configs[8] = { | ||
1648 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, | ||
1649 | 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e, | ||
1650 | }; | ||
1651 | |||
1652 | static unsigned int stac925xM6_pin_configs[8] = { | ||
1653 | 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020, | ||
1654 | 0x40a000f0, 0x90100210, 0x400003f1, 0x90330320, | ||
1581 | }; | 1655 | }; |
1582 | 1656 | ||
1583 | static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = { | 1657 | static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = { |
1584 | [STAC_REF] = ref925x_pin_configs, | 1658 | [STAC_REF] = ref925x_pin_configs, |
1659 | [STAC_M1] = stac925xM1_pin_configs, | ||
1660 | [STAC_M1_2] = stac925xM1_2_pin_configs, | ||
1661 | [STAC_M2] = stac925xM2_pin_configs, | ||
1585 | [STAC_M2_2] = stac925xM2_2_pin_configs, | 1662 | [STAC_M2_2] = stac925xM2_2_pin_configs, |
1586 | [STAC_MA6] = stac925x_MA6_pin_configs, | 1663 | [STAC_M3] = stac925xM3_pin_configs, |
1587 | [STAC_PA6] = stac925x_PA6_pin_configs, | 1664 | [STAC_M5] = stac925xM5_pin_configs, |
1665 | [STAC_M6] = stac925xM6_pin_configs, | ||
1588 | }; | 1666 | }; |
1589 | 1667 | ||
1590 | static const char *stac925x_models[STAC_925x_MODELS] = { | 1668 | static const char *stac925x_models[STAC_925x_MODELS] = { |
1669 | [STAC_925x_AUTO] = "auto", | ||
1591 | [STAC_REF] = "ref", | 1670 | [STAC_REF] = "ref", |
1671 | [STAC_M1] = "m1", | ||
1672 | [STAC_M1_2] = "m1-2", | ||
1673 | [STAC_M2] = "m2", | ||
1592 | [STAC_M2_2] = "m2-2", | 1674 | [STAC_M2_2] = "m2-2", |
1593 | [STAC_MA6] = "m6", | 1675 | [STAC_M3] = "m3", |
1594 | [STAC_PA6] = "pa6", | 1676 | [STAC_M5] = "m5", |
1677 | [STAC_M6] = "m6", | ||
1678 | }; | ||
1679 | |||
1680 | static struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = { | ||
1681 | SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2), | ||
1682 | SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5), | ||
1683 | SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1), | ||
1684 | SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2), | ||
1685 | SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2), | ||
1686 | /* Not sure about the brand name for those */ | ||
1687 | SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1), | ||
1688 | SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3), | ||
1689 | SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6), | ||
1690 | SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2), | ||
1691 | {} /* terminator */ | ||
1595 | }; | 1692 | }; |
1596 | 1693 | ||
1597 | static struct snd_pci_quirk stac925x_cfg_tbl[] = { | 1694 | static struct snd_pci_quirk stac925x_cfg_tbl[] = { |
1598 | /* SigmaTel reference board */ | 1695 | /* SigmaTel reference board */ |
1599 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), | 1696 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), |
1697 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF), | ||
1600 | SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF), | 1698 | SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF), |
1601 | SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF), | 1699 | |
1602 | SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF), | 1700 | /* Default table for unknown ID */ |
1603 | SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6), | 1701 | SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2), |
1604 | SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6), | 1702 | |
1605 | SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2), | ||
1606 | {} /* terminator */ | 1703 | {} /* terminator */ |
1607 | }; | 1704 | }; |
1608 | 1705 | ||
@@ -1629,6 +1726,7 @@ static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | |||
1629 | }; | 1726 | }; |
1630 | 1727 | ||
1631 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | 1728 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { |
1729 | [STAC_92HD73XX_AUTO] = "auto", | ||
1632 | [STAC_92HD73XX_NO_JD] = "no-jd", | 1730 | [STAC_92HD73XX_NO_JD] = "no-jd", |
1633 | [STAC_92HD73XX_REF] = "ref", | 1731 | [STAC_92HD73XX_REF] = "ref", |
1634 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", | 1732 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", |
@@ -1641,6 +1739,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1641 | /* SigmaTel reference board */ | 1739 | /* SigmaTel reference board */ |
1642 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1740 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1643 | "DFI LanParty", STAC_92HD73XX_REF), | 1741 | "DFI LanParty", STAC_92HD73XX_REF), |
1742 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
1743 | "DFI LanParty", STAC_92HD73XX_REF), | ||
1644 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, | 1744 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
1645 | "Dell Studio 1535", STAC_DELL_M6_DMIC), | 1745 | "Dell Studio 1535", STAC_DELL_M6_DMIC), |
1646 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, | 1746 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
@@ -1664,50 +1764,68 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1664 | {} /* terminator */ | 1764 | {} /* terminator */ |
1665 | }; | 1765 | }; |
1666 | 1766 | ||
1667 | static unsigned int ref92hd83xxx_pin_configs[14] = { | 1767 | static unsigned int ref92hd83xxx_pin_configs[10] = { |
1668 | 0x02214030, 0x02211010, 0x02a19020, 0x02170130, | 1768 | 0x02214030, 0x02211010, 0x02a19020, 0x02170130, |
1669 | 0x01014050, 0x01819040, 0x01014020, 0x90a3014e, | 1769 | 0x01014050, 0x01819040, 0x01014020, 0x90a3014e, |
1670 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x40f000f0, | ||
1671 | 0x01451160, 0x98560170, | 1770 | 0x01451160, 0x98560170, |
1672 | }; | 1771 | }; |
1673 | 1772 | ||
1773 | static unsigned int dell_s14_pin_configs[10] = { | ||
1774 | 0x02214030, 0x02211010, 0x02a19020, 0x01014050, | ||
1775 | 0x40f000f0, 0x01819040, 0x40f000f0, 0x90a60160, | ||
1776 | 0x40f000f0, 0x40f000f0, | ||
1777 | }; | ||
1778 | |||
1674 | static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { | 1779 | static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { |
1675 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, | 1780 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
1781 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, | ||
1782 | [STAC_DELL_S14] = dell_s14_pin_configs, | ||
1676 | }; | 1783 | }; |
1677 | 1784 | ||
1678 | static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | 1785 | static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { |
1786 | [STAC_92HD83XXX_AUTO] = "auto", | ||
1679 | [STAC_92HD83XXX_REF] = "ref", | 1787 | [STAC_92HD83XXX_REF] = "ref", |
1788 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", | ||
1789 | [STAC_DELL_S14] = "dell-s14", | ||
1680 | }; | 1790 | }; |
1681 | 1791 | ||
1682 | static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | 1792 | static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { |
1683 | /* SigmaTel reference board */ | 1793 | /* SigmaTel reference board */ |
1684 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1794 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1685 | "DFI LanParty", STAC_92HD71BXX_REF), | 1795 | "DFI LanParty", STAC_92HD83XXX_REF), |
1796 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
1797 | "DFI LanParty", STAC_92HD83XXX_REF), | ||
1798 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, | ||
1799 | "unknown Dell", STAC_DELL_S14), | ||
1686 | {} /* terminator */ | 1800 | {} /* terminator */ |
1687 | }; | 1801 | }; |
1688 | 1802 | ||
1689 | static unsigned int ref92hd71bxx_pin_configs[11] = { | 1803 | static unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = { |
1690 | 0x02214030, 0x02a19040, 0x01a19020, 0x01014010, | 1804 | 0x02214030, 0x02a19040, 0x01a19020, 0x01014010, |
1691 | 0x0181302e, 0x01014010, 0x01019020, 0x90a000f0, | 1805 | 0x0181302e, 0x01014010, 0x01019020, 0x90a000f0, |
1692 | 0x90a000f0, 0x01452050, 0x01452050, | 1806 | 0x90a000f0, 0x01452050, 0x01452050, 0x00000000, |
1807 | 0x00000000 | ||
1693 | }; | 1808 | }; |
1694 | 1809 | ||
1695 | static unsigned int dell_m4_1_pin_configs[11] = { | 1810 | static unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = { |
1696 | 0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110, | 1811 | 0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110, |
1697 | 0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0, | 1812 | 0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0, |
1698 | 0x40f000f0, 0x4f0000f0, 0x4f0000f0, | 1813 | 0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000, |
1814 | 0x00000000 | ||
1699 | }; | 1815 | }; |
1700 | 1816 | ||
1701 | static unsigned int dell_m4_2_pin_configs[11] = { | 1817 | static unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = { |
1702 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, | 1818 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, |
1703 | 0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0, | 1819 | 0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0, |
1704 | 0x40f000f0, 0x044413b0, 0x044413b0, | 1820 | 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000, |
1821 | 0x00000000 | ||
1705 | }; | 1822 | }; |
1706 | 1823 | ||
1707 | static unsigned int dell_m4_3_pin_configs[11] = { | 1824 | static unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = { |
1708 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, | 1825 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, |
1709 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, | 1826 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, |
1710 | 0x40f000f0, 0x044413b0, 0x044413b0, | 1827 | 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000, |
1828 | 0x00000000 | ||
1711 | }; | 1829 | }; |
1712 | 1830 | ||
1713 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | 1831 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { |
@@ -1716,28 +1834,39 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | |||
1716 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, | 1834 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, |
1717 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, | 1835 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, |
1718 | [STAC_HP_M4] = NULL, | 1836 | [STAC_HP_M4] = NULL, |
1837 | [STAC_HP_DV5] = NULL, | ||
1838 | [STAC_HP_HDX] = NULL, | ||
1719 | }; | 1839 | }; |
1720 | 1840 | ||
1721 | static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | 1841 | static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { |
1842 | [STAC_92HD71BXX_AUTO] = "auto", | ||
1722 | [STAC_92HD71BXX_REF] = "ref", | 1843 | [STAC_92HD71BXX_REF] = "ref", |
1723 | [STAC_DELL_M4_1] = "dell-m4-1", | 1844 | [STAC_DELL_M4_1] = "dell-m4-1", |
1724 | [STAC_DELL_M4_2] = "dell-m4-2", | 1845 | [STAC_DELL_M4_2] = "dell-m4-2", |
1725 | [STAC_DELL_M4_3] = "dell-m4-3", | 1846 | [STAC_DELL_M4_3] = "dell-m4-3", |
1726 | [STAC_HP_M4] = "hp-m4", | 1847 | [STAC_HP_M4] = "hp-m4", |
1848 | [STAC_HP_DV5] = "hp-dv5", | ||
1849 | [STAC_HP_HDX] = "hp-hdx", | ||
1727 | }; | 1850 | }; |
1728 | 1851 | ||
1729 | static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | 1852 | static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { |
1730 | /* SigmaTel reference board */ | 1853 | /* SigmaTel reference board */ |
1731 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1854 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1732 | "DFI LanParty", STAC_92HD71BXX_REF), | 1855 | "DFI LanParty", STAC_92HD71BXX_REF), |
1733 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2, | 1856 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, |
1734 | "HP dv5", STAC_HP_M4), | 1857 | "DFI LanParty", STAC_92HD71BXX_REF), |
1735 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, | 1858 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, |
1736 | "HP dv7", STAC_HP_M4), | 1859 | "HP", STAC_HP_DV5), |
1737 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc, | 1860 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, |
1738 | "HP dv7", STAC_HP_M4), | 1861 | "HP dv4-7", STAC_HP_DV5), |
1862 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600, | ||
1863 | "HP dv4-7", STAC_HP_DV5), | ||
1864 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610, | ||
1865 | "HP HDX", STAC_HP_HDX), /* HDX18 */ | ||
1739 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, | 1866 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, |
1740 | "unknown HP", STAC_HP_M4), | 1867 | "HP mini 1000", STAC_HP_M4), |
1868 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b, | ||
1869 | "HP HDX", STAC_HP_HDX), /* HDX16 */ | ||
1741 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, | 1870 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
1742 | "unknown Dell", STAC_DELL_M4_1), | 1871 | "unknown Dell", STAC_DELL_M4_1), |
1743 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234, | 1872 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234, |
@@ -1889,6 +2018,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { | |||
1889 | }; | 2018 | }; |
1890 | 2019 | ||
1891 | static const char *stac922x_models[STAC_922X_MODELS] = { | 2020 | static const char *stac922x_models[STAC_922X_MODELS] = { |
2021 | [STAC_922X_AUTO] = "auto", | ||
1892 | [STAC_D945_REF] = "ref", | 2022 | [STAC_D945_REF] = "ref", |
1893 | [STAC_D945GTP5] = "5stack", | 2023 | [STAC_D945GTP5] = "5stack", |
1894 | [STAC_D945GTP3] = "3stack", | 2024 | [STAC_D945GTP3] = "3stack", |
@@ -1916,6 +2046,8 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = { | |||
1916 | /* SigmaTel reference board */ | 2046 | /* SigmaTel reference board */ |
1917 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 2047 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1918 | "DFI LanParty", STAC_D945_REF), | 2048 | "DFI LanParty", STAC_D945_REF), |
2049 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
2050 | "DFI LanParty", STAC_D945_REF), | ||
1919 | /* Intel 945G based systems */ | 2051 | /* Intel 945G based systems */ |
1920 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101, | 2052 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101, |
1921 | "Intel D945G", STAC_D945GTP3), | 2053 | "Intel D945G", STAC_D945GTP3), |
@@ -1969,6 +2101,9 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = { | |||
1969 | "Intel D945P", STAC_D945GTP3), | 2101 | "Intel D945P", STAC_D945GTP3), |
1970 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707, | 2102 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707, |
1971 | "Intel D945P", STAC_D945GTP5), | 2103 | "Intel D945P", STAC_D945GTP5), |
2104 | /* other intel */ | ||
2105 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204, | ||
2106 | "Intel D945", STAC_D945_REF), | ||
1972 | /* other systems */ | 2107 | /* other systems */ |
1973 | /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */ | 2108 | /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */ |
1974 | SND_PCI_QUIRK(0x8384, 0x7680, | 2109 | SND_PCI_QUIRK(0x8384, 0x7680, |
@@ -1993,31 +2128,7 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = { | |||
1993 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7, | 2128 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7, |
1994 | "Dell XPS M1210", STAC_922X_DELL_M82), | 2129 | "Dell XPS M1210", STAC_922X_DELL_M82), |
1995 | /* ECS/PC Chips boards */ | 2130 | /* ECS/PC Chips boards */ |
1996 | SND_PCI_QUIRK(0x1019, 0x2144, | 2131 | SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000, |
1997 | "ECS/PC chips", STAC_ECS_202), | ||
1998 | SND_PCI_QUIRK(0x1019, 0x2608, | ||
1999 | "ECS/PC chips", STAC_ECS_202), | ||
2000 | SND_PCI_QUIRK(0x1019, 0x2633, | ||
2001 | "ECS/PC chips P17G/1333", STAC_ECS_202), | ||
2002 | SND_PCI_QUIRK(0x1019, 0x2811, | ||
2003 | "ECS/PC chips", STAC_ECS_202), | ||
2004 | SND_PCI_QUIRK(0x1019, 0x2812, | ||
2005 | "ECS/PC chips", STAC_ECS_202), | ||
2006 | SND_PCI_QUIRK(0x1019, 0x2813, | ||
2007 | "ECS/PC chips", STAC_ECS_202), | ||
2008 | SND_PCI_QUIRK(0x1019, 0x2814, | ||
2009 | "ECS/PC chips", STAC_ECS_202), | ||
2010 | SND_PCI_QUIRK(0x1019, 0x2815, | ||
2011 | "ECS/PC chips", STAC_ECS_202), | ||
2012 | SND_PCI_QUIRK(0x1019, 0x2816, | ||
2013 | "ECS/PC chips", STAC_ECS_202), | ||
2014 | SND_PCI_QUIRK(0x1019, 0x2817, | ||
2015 | "ECS/PC chips", STAC_ECS_202), | ||
2016 | SND_PCI_QUIRK(0x1019, 0x2818, | ||
2017 | "ECS/PC chips", STAC_ECS_202), | ||
2018 | SND_PCI_QUIRK(0x1019, 0x2819, | ||
2019 | "ECS/PC chips", STAC_ECS_202), | ||
2020 | SND_PCI_QUIRK(0x1019, 0x2820, | ||
2021 | "ECS/PC chips", STAC_ECS_202), | 2132 | "ECS/PC chips", STAC_ECS_202), |
2022 | {} /* terminator */ | 2133 | {} /* terminator */ |
2023 | }; | 2134 | }; |
@@ -2060,6 +2171,7 @@ static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = { | |||
2060 | }; | 2171 | }; |
2061 | 2172 | ||
2062 | static const char *stac927x_models[STAC_927X_MODELS] = { | 2173 | static const char *stac927x_models[STAC_927X_MODELS] = { |
2174 | [STAC_927X_AUTO] = "auto", | ||
2063 | [STAC_D965_REF_NO_JD] = "ref-no-jd", | 2175 | [STAC_D965_REF_NO_JD] = "ref-no-jd", |
2064 | [STAC_D965_REF] = "ref", | 2176 | [STAC_D965_REF] = "ref", |
2065 | [STAC_D965_3ST] = "3stack", | 2177 | [STAC_D965_3ST] = "3stack", |
@@ -2072,26 +2184,16 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = { | |||
2072 | /* SigmaTel reference board */ | 2184 | /* SigmaTel reference board */ |
2073 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 2185 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
2074 | "DFI LanParty", STAC_D965_REF), | 2186 | "DFI LanParty", STAC_D965_REF), |
2187 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
2188 | "DFI LanParty", STAC_D965_REF), | ||
2075 | /* Intel 946 based systems */ | 2189 | /* Intel 946 based systems */ |
2076 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST), | 2190 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST), |
2077 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST), | 2191 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST), |
2078 | /* 965 based 3 stack systems */ | 2192 | /* 965 based 3 stack systems */ |
2079 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST), | 2193 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100, |
2080 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST), | 2194 | "Intel D965", STAC_D965_3ST), |
2081 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST), | 2195 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000, |
2082 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST), | 2196 | "Intel D965", STAC_D965_3ST), |
2083 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST), | ||
2084 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST), | ||
2085 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST), | ||
2086 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST), | ||
2087 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST), | ||
2088 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST), | ||
2089 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST), | ||
2090 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST), | ||
2091 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST), | ||
2092 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST), | ||
2093 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST), | ||
2094 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST), | ||
2095 | /* Dell 3 stack systems */ | 2197 | /* Dell 3 stack systems */ |
2096 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST), | 2198 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST), |
2097 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST), | 2199 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST), |
@@ -2107,15 +2209,10 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = { | |||
2107 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), | 2209 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), |
2108 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS), | 2210 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS), |
2109 | /* 965 based 5 stack systems */ | 2211 | /* 965 based 5 stack systems */ |
2110 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST), | 2212 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300, |
2111 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST), | 2213 | "Intel D965", STAC_D965_5ST), |
2112 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST), | 2214 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, |
2113 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST), | 2215 | "Intel D965", STAC_D965_5ST), |
2114 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST), | ||
2115 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST), | ||
2116 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST), | ||
2117 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST), | ||
2118 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST), | ||
2119 | {} /* terminator */ | 2216 | {} /* terminator */ |
2120 | }; | 2217 | }; |
2121 | 2218 | ||
@@ -2168,19 +2265,25 @@ static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = { | |||
2168 | [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs, | 2265 | [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs, |
2169 | [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs, | 2266 | [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs, |
2170 | [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs, | 2267 | [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs, |
2268 | [STAC_9205_EAPD] = NULL, | ||
2171 | }; | 2269 | }; |
2172 | 2270 | ||
2173 | static const char *stac9205_models[STAC_9205_MODELS] = { | 2271 | static const char *stac9205_models[STAC_9205_MODELS] = { |
2272 | [STAC_9205_AUTO] = "auto", | ||
2174 | [STAC_9205_REF] = "ref", | 2273 | [STAC_9205_REF] = "ref", |
2175 | [STAC_9205_DELL_M42] = "dell-m42", | 2274 | [STAC_9205_DELL_M42] = "dell-m42", |
2176 | [STAC_9205_DELL_M43] = "dell-m43", | 2275 | [STAC_9205_DELL_M43] = "dell-m43", |
2177 | [STAC_9205_DELL_M44] = "dell-m44", | 2276 | [STAC_9205_DELL_M44] = "dell-m44", |
2277 | [STAC_9205_EAPD] = "eapd", | ||
2178 | }; | 2278 | }; |
2179 | 2279 | ||
2180 | static struct snd_pci_quirk stac9205_cfg_tbl[] = { | 2280 | static struct snd_pci_quirk stac9205_cfg_tbl[] = { |
2181 | /* SigmaTel reference board */ | 2281 | /* SigmaTel reference board */ |
2182 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 2282 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
2183 | "DFI LanParty", STAC_9205_REF), | 2283 | "DFI LanParty", STAC_9205_REF), |
2284 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | ||
2285 | "DFI LanParty", STAC_9205_REF), | ||
2286 | /* Dell */ | ||
2184 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1, | 2287 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1, |
2185 | "unknown Dell", STAC_9205_DELL_M42), | 2288 | "unknown Dell", STAC_9205_DELL_M42), |
2186 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2, | 2289 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2, |
@@ -2211,101 +2314,24 @@ static struct snd_pci_quirk stac9205_cfg_tbl[] = { | |||
2211 | "Dell Inspiron", STAC_9205_DELL_M44), | 2314 | "Dell Inspiron", STAC_9205_DELL_M44), |
2212 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228, | 2315 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228, |
2213 | "Dell Vostro 1500", STAC_9205_DELL_M42), | 2316 | "Dell Vostro 1500", STAC_9205_DELL_M42), |
2317 | /* Gateway */ | ||
2318 | SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD), | ||
2214 | {} /* terminator */ | 2319 | {} /* terminator */ |
2215 | }; | 2320 | }; |
2216 | 2321 | ||
2217 | static int stac92xx_save_bios_config_regs(struct hda_codec *codec) | 2322 | static void stac92xx_set_config_regs(struct hda_codec *codec, |
2323 | unsigned int *pincfgs) | ||
2218 | { | 2324 | { |
2219 | int i; | 2325 | int i; |
2220 | struct sigmatel_spec *spec = codec->spec; | 2326 | struct sigmatel_spec *spec = codec->spec; |
2221 | |||
2222 | kfree(spec->pin_configs); | ||
2223 | spec->pin_configs = kcalloc(spec->num_pins, sizeof(*spec->pin_configs), | ||
2224 | GFP_KERNEL); | ||
2225 | if (!spec->pin_configs) | ||
2226 | return -ENOMEM; | ||
2227 | |||
2228 | for (i = 0; i < spec->num_pins; i++) { | ||
2229 | hda_nid_t nid = spec->pin_nids[i]; | ||
2230 | unsigned int pin_cfg; | ||
2231 | |||
2232 | pin_cfg = snd_hda_codec_read(codec, nid, 0, | ||
2233 | AC_VERB_GET_CONFIG_DEFAULT, 0x00); | ||
2234 | snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n", | ||
2235 | nid, pin_cfg); | ||
2236 | spec->pin_configs[i] = pin_cfg; | ||
2237 | } | ||
2238 | |||
2239 | return 0; | ||
2240 | } | ||
2241 | 2327 | ||
2242 | static void stac92xx_set_config_reg(struct hda_codec *codec, | 2328 | if (!pincfgs) |
2243 | hda_nid_t pin_nid, unsigned int pin_config) | 2329 | return; |
2244 | { | ||
2245 | int i; | ||
2246 | snd_hda_codec_write(codec, pin_nid, 0, | ||
2247 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_0, | ||
2248 | pin_config & 0x000000ff); | ||
2249 | snd_hda_codec_write(codec, pin_nid, 0, | ||
2250 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, | ||
2251 | (pin_config & 0x0000ff00) >> 8); | ||
2252 | snd_hda_codec_write(codec, pin_nid, 0, | ||
2253 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, | ||
2254 | (pin_config & 0x00ff0000) >> 16); | ||
2255 | snd_hda_codec_write(codec, pin_nid, 0, | ||
2256 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, | ||
2257 | pin_config >> 24); | ||
2258 | i = snd_hda_codec_read(codec, pin_nid, 0, | ||
2259 | AC_VERB_GET_CONFIG_DEFAULT, | ||
2260 | 0x00); | ||
2261 | snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n", | ||
2262 | pin_nid, i); | ||
2263 | } | ||
2264 | |||
2265 | static void stac92xx_set_config_regs(struct hda_codec *codec) | ||
2266 | { | ||
2267 | int i; | ||
2268 | struct sigmatel_spec *spec = codec->spec; | ||
2269 | |||
2270 | if (!spec->pin_configs) | ||
2271 | return; | ||
2272 | 2330 | ||
2273 | for (i = 0; i < spec->num_pins; i++) | 2331 | for (i = 0; i < spec->num_pins; i++) |
2274 | stac92xx_set_config_reg(codec, spec->pin_nids[i], | 2332 | if (spec->pin_nids[i] && pincfgs[i]) |
2275 | spec->pin_configs[i]); | 2333 | snd_hda_codec_set_pincfg(codec, spec->pin_nids[i], |
2276 | } | 2334 | pincfgs[i]); |
2277 | |||
2278 | static int stac_save_pin_cfgs(struct hda_codec *codec, unsigned int *pins) | ||
2279 | { | ||
2280 | struct sigmatel_spec *spec = codec->spec; | ||
2281 | |||
2282 | if (!pins) | ||
2283 | return stac92xx_save_bios_config_regs(codec); | ||
2284 | |||
2285 | kfree(spec->pin_configs); | ||
2286 | spec->pin_configs = kmemdup(pins, | ||
2287 | spec->num_pins * sizeof(*pins), | ||
2288 | GFP_KERNEL); | ||
2289 | if (!spec->pin_configs) | ||
2290 | return -ENOMEM; | ||
2291 | |||
2292 | stac92xx_set_config_regs(codec); | ||
2293 | return 0; | ||
2294 | } | ||
2295 | |||
2296 | static void stac_change_pin_config(struct hda_codec *codec, hda_nid_t nid, | ||
2297 | unsigned int cfg) | ||
2298 | { | ||
2299 | struct sigmatel_spec *spec = codec->spec; | ||
2300 | int i; | ||
2301 | |||
2302 | for (i = 0; i < spec->num_pins; i++) { | ||
2303 | if (spec->pin_nids[i] == nid) { | ||
2304 | spec->pin_configs[i] = cfg; | ||
2305 | stac92xx_set_config_reg(codec, nid, cfg); | ||
2306 | break; | ||
2307 | } | ||
2308 | } | ||
2309 | } | 2335 | } |
2310 | 2336 | ||
2311 | /* | 2337 | /* |
@@ -2370,6 +2396,14 @@ static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
2370 | stream_tag, format, substream); | 2396 | stream_tag, format, substream); |
2371 | } | 2397 | } |
2372 | 2398 | ||
2399 | static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
2400 | struct hda_codec *codec, | ||
2401 | struct snd_pcm_substream *substream) | ||
2402 | { | ||
2403 | struct sigmatel_spec *spec = codec->spec; | ||
2404 | return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); | ||
2405 | } | ||
2406 | |||
2373 | 2407 | ||
2374 | /* | 2408 | /* |
2375 | * Analog capture callbacks | 2409 | * Analog capture callbacks |
@@ -2414,7 +2448,8 @@ static struct hda_pcm_stream stac92xx_pcm_digital_playback = { | |||
2414 | .ops = { | 2448 | .ops = { |
2415 | .open = stac92xx_dig_playback_pcm_open, | 2449 | .open = stac92xx_dig_playback_pcm_open, |
2416 | .close = stac92xx_dig_playback_pcm_close, | 2450 | .close = stac92xx_dig_playback_pcm_close, |
2417 | .prepare = stac92xx_dig_playback_pcm_prepare | 2451 | .prepare = stac92xx_dig_playback_pcm_prepare, |
2452 | .cleanup = stac92xx_dig_playback_pcm_cleanup | ||
2418 | }, | 2453 | }, |
2419 | }; | 2454 | }; |
2420 | 2455 | ||
@@ -2469,6 +2504,8 @@ static int stac92xx_build_pcms(struct hda_codec *codec) | |||
2469 | 2504 | ||
2470 | info->name = "STAC92xx Analog"; | 2505 | info->name = "STAC92xx Analog"; |
2471 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback; | 2506 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback; |
2507 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = | ||
2508 | spec->multiout.dac_nids[0]; | ||
2472 | info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture; | 2509 | info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture; |
2473 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; | 2510 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; |
2474 | info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs; | 2511 | info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs; |
@@ -2484,7 +2521,7 @@ static int stac92xx_build_pcms(struct hda_codec *codec) | |||
2484 | codec->num_pcms++; | 2521 | codec->num_pcms++; |
2485 | info++; | 2522 | info++; |
2486 | info->name = "STAC92xx Digital"; | 2523 | info->name = "STAC92xx Digital"; |
2487 | info->pcm_type = HDA_PCM_TYPE_SPDIF; | 2524 | info->pcm_type = spec->autocfg.dig_out_type[0]; |
2488 | if (spec->multiout.dig_out_nid) { | 2525 | if (spec->multiout.dig_out_nid) { |
2489 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback; | 2526 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback; |
2490 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid; | 2527 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid; |
@@ -2500,8 +2537,7 @@ static int stac92xx_build_pcms(struct hda_codec *codec) | |||
2500 | 2537 | ||
2501 | static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid) | 2538 | static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid) |
2502 | { | 2539 | { |
2503 | unsigned int pincap = snd_hda_param_read(codec, nid, | 2540 | unsigned int pincap = snd_hda_query_pin_caps(codec, nid); |
2504 | AC_PAR_PIN_CAP); | ||
2505 | pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; | 2541 | pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; |
2506 | if (pincap & AC_PINCAP_VREF_100) | 2542 | if (pincap & AC_PINCAP_VREF_100) |
2507 | return AC_PINCTL_VREF_100; | 2543 | return AC_PINCTL_VREF_100; |
@@ -2676,22 +2712,37 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = { | |||
2676 | }; | 2712 | }; |
2677 | 2713 | ||
2678 | /* add dynamic controls */ | 2714 | /* add dynamic controls */ |
2679 | static int stac92xx_add_control_temp(struct sigmatel_spec *spec, | 2715 | static struct snd_kcontrol_new * |
2680 | struct snd_kcontrol_new *ktemp, | 2716 | stac_control_new(struct sigmatel_spec *spec, |
2681 | int idx, const char *name, | 2717 | struct snd_kcontrol_new *ktemp, |
2682 | unsigned long val) | 2718 | const char *name) |
2683 | { | 2719 | { |
2684 | struct snd_kcontrol_new *knew; | 2720 | struct snd_kcontrol_new *knew; |
2685 | 2721 | ||
2686 | snd_array_init(&spec->kctls, sizeof(*knew), 32); | 2722 | snd_array_init(&spec->kctls, sizeof(*knew), 32); |
2687 | knew = snd_array_new(&spec->kctls); | 2723 | knew = snd_array_new(&spec->kctls); |
2688 | if (!knew) | 2724 | if (!knew) |
2689 | return -ENOMEM; | 2725 | return NULL; |
2690 | *knew = *ktemp; | 2726 | *knew = *ktemp; |
2691 | knew->index = idx; | ||
2692 | knew->name = kstrdup(name, GFP_KERNEL); | 2727 | knew->name = kstrdup(name, GFP_KERNEL); |
2693 | if (!knew->name) | 2728 | if (!knew->name) { |
2729 | /* roolback */ | ||
2730 | memset(knew, 0, sizeof(*knew)); | ||
2731 | spec->kctls.alloced--; | ||
2732 | return NULL; | ||
2733 | } | ||
2734 | return knew; | ||
2735 | } | ||
2736 | |||
2737 | static int stac92xx_add_control_temp(struct sigmatel_spec *spec, | ||
2738 | struct snd_kcontrol_new *ktemp, | ||
2739 | int idx, const char *name, | ||
2740 | unsigned long val) | ||
2741 | { | ||
2742 | struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name); | ||
2743 | if (!knew) | ||
2694 | return -ENOMEM; | 2744 | return -ENOMEM; |
2745 | knew->index = idx; | ||
2695 | knew->private_value = val; | 2746 | knew->private_value = val; |
2696 | return 0; | 2747 | return 0; |
2697 | } | 2748 | } |
@@ -2713,6 +2764,29 @@ static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type, | |||
2713 | return stac92xx_add_control_idx(spec, type, 0, name, val); | 2764 | return stac92xx_add_control_idx(spec, type, 0, name, val); |
2714 | } | 2765 | } |
2715 | 2766 | ||
2767 | static struct snd_kcontrol_new stac_input_src_temp = { | ||
2768 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
2769 | .name = "Input Source", | ||
2770 | .info = stac92xx_mux_enum_info, | ||
2771 | .get = stac92xx_mux_enum_get, | ||
2772 | .put = stac92xx_mux_enum_put, | ||
2773 | }; | ||
2774 | |||
2775 | static int stac92xx_add_input_source(struct sigmatel_spec *spec) | ||
2776 | { | ||
2777 | struct snd_kcontrol_new *knew; | ||
2778 | struct hda_input_mux *imux = &spec->private_imux; | ||
2779 | |||
2780 | if (!spec->num_adcs || imux->num_items <= 1) | ||
2781 | return 0; /* no need for input source control */ | ||
2782 | knew = stac_control_new(spec, &stac_input_src_temp, | ||
2783 | stac_input_src_temp.name); | ||
2784 | if (!knew) | ||
2785 | return -ENOMEM; | ||
2786 | knew->count = spec->num_adcs; | ||
2787 | return 0; | ||
2788 | } | ||
2789 | |||
2716 | /* check whether the line-input can be used as line-out */ | 2790 | /* check whether the line-input can be used as line-out */ |
2717 | static hda_nid_t check_line_out_switch(struct hda_codec *codec) | 2791 | static hda_nid_t check_line_out_switch(struct hda_codec *codec) |
2718 | { | 2792 | { |
@@ -2724,7 +2798,7 @@ static hda_nid_t check_line_out_switch(struct hda_codec *codec) | |||
2724 | if (cfg->line_out_type != AUTO_PIN_LINE_OUT) | 2798 | if (cfg->line_out_type != AUTO_PIN_LINE_OUT) |
2725 | return 0; | 2799 | return 0; |
2726 | nid = cfg->input_pins[AUTO_PIN_LINE]; | 2800 | nid = cfg->input_pins[AUTO_PIN_LINE]; |
2727 | pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | 2801 | pincap = snd_hda_query_pin_caps(codec, nid); |
2728 | if (pincap & AC_PINCAP_OUT) | 2802 | if (pincap & AC_PINCAP_OUT) |
2729 | return nid; | 2803 | return nid; |
2730 | return 0; | 2804 | return 0; |
@@ -2743,12 +2817,11 @@ static hda_nid_t check_mic_out_switch(struct hda_codec *codec) | |||
2743 | mic_pin = AUTO_PIN_MIC; | 2817 | mic_pin = AUTO_PIN_MIC; |
2744 | for (;;) { | 2818 | for (;;) { |
2745 | hda_nid_t nid = cfg->input_pins[mic_pin]; | 2819 | hda_nid_t nid = cfg->input_pins[mic_pin]; |
2746 | def_conf = snd_hda_codec_read(codec, nid, 0, | 2820 | def_conf = snd_hda_codec_get_pincfg(codec, nid); |
2747 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
2748 | /* some laptops have an internal analog microphone | 2821 | /* some laptops have an internal analog microphone |
2749 | * which can't be used as a output */ | 2822 | * which can't be used as a output */ |
2750 | if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) { | 2823 | if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) { |
2751 | pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | 2824 | pincap = snd_hda_query_pin_caps(codec, nid); |
2752 | if (pincap & AC_PINCAP_OUT) | 2825 | if (pincap & AC_PINCAP_OUT) |
2753 | return nid; | 2826 | return nid; |
2754 | } | 2827 | } |
@@ -2796,8 +2869,7 @@ static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid) | |||
2796 | conn_len = snd_hda_get_connections(codec, nid, conn, | 2869 | conn_len = snd_hda_get_connections(codec, nid, conn, |
2797 | HDA_MAX_CONNECTIONS); | 2870 | HDA_MAX_CONNECTIONS); |
2798 | for (j = 0; j < conn_len; j++) { | 2871 | for (j = 0; j < conn_len; j++) { |
2799 | wcaps = snd_hda_param_read(codec, conn[j], | 2872 | wcaps = get_wcaps(codec, conn[j]); |
2800 | AC_PAR_AUDIO_WIDGET_CAP); | ||
2801 | wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | 2873 | wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; |
2802 | /* we check only analog outputs */ | 2874 | /* we check only analog outputs */ |
2803 | if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL)) | 2875 | if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL)) |
@@ -2812,6 +2884,16 @@ static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid) | |||
2812 | return conn[j]; | 2884 | return conn[j]; |
2813 | } | 2885 | } |
2814 | } | 2886 | } |
2887 | /* if all DACs are already assigned, connect to the primary DAC */ | ||
2888 | if (conn_len > 1) { | ||
2889 | for (j = 0; j < conn_len; j++) { | ||
2890 | if (conn[j] == spec->multiout.dac_nids[0]) { | ||
2891 | snd_hda_codec_write_cache(codec, nid, 0, | ||
2892 | AC_VERB_SET_CONNECT_SEL, j); | ||
2893 | break; | ||
2894 | } | ||
2895 | } | ||
2896 | } | ||
2815 | return 0; | 2897 | return 0; |
2816 | } | 2898 | } |
2817 | 2899 | ||
@@ -2852,6 +2934,26 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec) | |||
2852 | add_spec_dacs(spec, dac); | 2934 | add_spec_dacs(spec, dac); |
2853 | } | 2935 | } |
2854 | 2936 | ||
2937 | for (i = 0; i < cfg->hp_outs; i++) { | ||
2938 | nid = cfg->hp_pins[i]; | ||
2939 | dac = get_unassigned_dac(codec, nid); | ||
2940 | if (dac) { | ||
2941 | if (!spec->multiout.hp_nid) | ||
2942 | spec->multiout.hp_nid = dac; | ||
2943 | else | ||
2944 | add_spec_extra_dacs(spec, dac); | ||
2945 | } | ||
2946 | spec->hp_dacs[i] = dac; | ||
2947 | } | ||
2948 | |||
2949 | for (i = 0; i < cfg->speaker_outs; i++) { | ||
2950 | nid = cfg->speaker_pins[i]; | ||
2951 | dac = get_unassigned_dac(codec, nid); | ||
2952 | if (dac) | ||
2953 | add_spec_extra_dacs(spec, dac); | ||
2954 | spec->speaker_dacs[i] = dac; | ||
2955 | } | ||
2956 | |||
2855 | /* add line-in as output */ | 2957 | /* add line-in as output */ |
2856 | nid = check_line_out_switch(codec); | 2958 | nid = check_line_out_switch(codec); |
2857 | if (nid) { | 2959 | if (nid) { |
@@ -2879,26 +2981,6 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec) | |||
2879 | } | 2981 | } |
2880 | } | 2982 | } |
2881 | 2983 | ||
2882 | for (i = 0; i < cfg->hp_outs; i++) { | ||
2883 | nid = cfg->hp_pins[i]; | ||
2884 | dac = get_unassigned_dac(codec, nid); | ||
2885 | if (dac) { | ||
2886 | if (!spec->multiout.hp_nid) | ||
2887 | spec->multiout.hp_nid = dac; | ||
2888 | else | ||
2889 | add_spec_extra_dacs(spec, dac); | ||
2890 | } | ||
2891 | spec->hp_dacs[i] = dac; | ||
2892 | } | ||
2893 | |||
2894 | for (i = 0; i < cfg->speaker_outs; i++) { | ||
2895 | nid = cfg->speaker_pins[i]; | ||
2896 | dac = get_unassigned_dac(codec, nid); | ||
2897 | if (dac) | ||
2898 | add_spec_extra_dacs(spec, dac); | ||
2899 | spec->speaker_dacs[i] = dac; | ||
2900 | } | ||
2901 | |||
2902 | snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", | 2984 | snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", |
2903 | spec->multiout.num_dacs, | 2985 | spec->multiout.num_dacs, |
2904 | spec->multiout.dac_nids[0], | 2986 | spec->multiout.dac_nids[0], |
@@ -2911,24 +2993,47 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec) | |||
2911 | } | 2993 | } |
2912 | 2994 | ||
2913 | /* create volume control/switch for the given prefx type */ | 2995 | /* create volume control/switch for the given prefx type */ |
2914 | static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs) | 2996 | static int create_controls_idx(struct hda_codec *codec, const char *pfx, |
2997 | int idx, hda_nid_t nid, int chs) | ||
2915 | { | 2998 | { |
2999 | struct sigmatel_spec *spec = codec->spec; | ||
2916 | char name[32]; | 3000 | char name[32]; |
2917 | int err; | 3001 | int err; |
2918 | 3002 | ||
3003 | if (!spec->check_volume_offset) { | ||
3004 | unsigned int caps, step, nums, db_scale; | ||
3005 | caps = query_amp_caps(codec, nid, HDA_OUTPUT); | ||
3006 | step = (caps & AC_AMPCAP_STEP_SIZE) >> | ||
3007 | AC_AMPCAP_STEP_SIZE_SHIFT; | ||
3008 | step = (step + 1) * 25; /* in .01dB unit */ | ||
3009 | nums = (caps & AC_AMPCAP_NUM_STEPS) >> | ||
3010 | AC_AMPCAP_NUM_STEPS_SHIFT; | ||
3011 | db_scale = nums * step; | ||
3012 | /* if dB scale is over -64dB, and finer enough, | ||
3013 | * let's reduce it to half | ||
3014 | */ | ||
3015 | if (db_scale > 6400 && nums >= 0x1f) | ||
3016 | spec->volume_offset = nums / 2; | ||
3017 | spec->check_volume_offset = 1; | ||
3018 | } | ||
3019 | |||
2919 | sprintf(name, "%s Playback Volume", pfx); | 3020 | sprintf(name, "%s Playback Volume", pfx); |
2920 | err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name, | 3021 | err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name, |
2921 | HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); | 3022 | HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT, |
3023 | spec->volume_offset)); | ||
2922 | if (err < 0) | 3024 | if (err < 0) |
2923 | return err; | 3025 | return err; |
2924 | sprintf(name, "%s Playback Switch", pfx); | 3026 | sprintf(name, "%s Playback Switch", pfx); |
2925 | err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name, | 3027 | err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name, |
2926 | HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); | 3028 | HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); |
2927 | if (err < 0) | 3029 | if (err < 0) |
2928 | return err; | 3030 | return err; |
2929 | return 0; | 3031 | return 0; |
2930 | } | 3032 | } |
2931 | 3033 | ||
3034 | #define create_controls(codec, pfx, nid, chs) \ | ||
3035 | create_controls_idx(codec, pfx, 0, nid, chs) | ||
3036 | |||
2932 | static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid) | 3037 | static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid) |
2933 | { | 3038 | { |
2934 | if (spec->multiout.num_dacs > 4) { | 3039 | if (spec->multiout.num_dacs > 4) { |
@@ -2954,40 +3059,37 @@ static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid) | |||
2954 | return 1; | 3059 | return 1; |
2955 | } | 3060 | } |
2956 | 3061 | ||
2957 | static int is_unique_dac(struct sigmatel_spec *spec, hda_nid_t nid) | 3062 | /* Create output controls |
2958 | { | 3063 | * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT) |
2959 | int i; | 3064 | */ |
2960 | 3065 | static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, | |
2961 | if (spec->autocfg.line_outs != 1) | 3066 | const hda_nid_t *pins, |
2962 | return 0; | 3067 | const hda_nid_t *dac_nids, |
2963 | if (spec->multiout.hp_nid == nid) | 3068 | int type) |
2964 | return 0; | ||
2965 | for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) | ||
2966 | if (spec->multiout.extra_out_nid[i] == nid) | ||
2967 | return 0; | ||
2968 | return 1; | ||
2969 | } | ||
2970 | |||
2971 | /* add playback controls from the parsed DAC table */ | ||
2972 | static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | ||
2973 | const struct auto_pin_cfg *cfg) | ||
2974 | { | 3069 | { |
2975 | struct sigmatel_spec *spec = codec->spec; | 3070 | struct sigmatel_spec *spec = codec->spec; |
2976 | static const char *chname[4] = { | 3071 | static const char *chname[4] = { |
2977 | "Front", "Surround", NULL /*CLFE*/, "Side" | 3072 | "Front", "Surround", NULL /*CLFE*/, "Side" |
2978 | }; | 3073 | }; |
2979 | hda_nid_t nid = 0; | 3074 | hda_nid_t nid; |
2980 | int i, err; | 3075 | int i, err; |
2981 | unsigned int wid_caps; | 3076 | unsigned int wid_caps; |
2982 | 3077 | ||
2983 | for (i = 0; i < cfg->line_outs && spec->multiout.dac_nids[i]; i++) { | 3078 | for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) { |
2984 | nid = spec->multiout.dac_nids[i]; | 3079 | if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) { |
2985 | if (i == 2) { | 3080 | wid_caps = get_wcaps(codec, pins[i]); |
3081 | if (wid_caps & AC_WCAP_UNSOL_CAP) | ||
3082 | spec->hp_detect = 1; | ||
3083 | } | ||
3084 | nid = dac_nids[i]; | ||
3085 | if (!nid) | ||
3086 | continue; | ||
3087 | if (type != AUTO_PIN_HP_OUT && i == 2) { | ||
2986 | /* Center/LFE */ | 3088 | /* Center/LFE */ |
2987 | err = create_controls(spec, "Center", nid, 1); | 3089 | err = create_controls(codec, "Center", nid, 1); |
2988 | if (err < 0) | 3090 | if (err < 0) |
2989 | return err; | 3091 | return err; |
2990 | err = create_controls(spec, "LFE", nid, 2); | 3092 | err = create_controls(codec, "LFE", nid, 2); |
2991 | if (err < 0) | 3093 | if (err < 0) |
2992 | return err; | 3094 | return err; |
2993 | 3095 | ||
@@ -3003,23 +3105,42 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
3003 | } | 3105 | } |
3004 | 3106 | ||
3005 | } else { | 3107 | } else { |
3006 | const char *name = chname[i]; | 3108 | const char *name; |
3007 | /* if it's a single DAC, assign a better name */ | 3109 | int idx; |
3008 | if (!i && is_unique_dac(spec, nid)) { | 3110 | switch (type) { |
3009 | switch (cfg->line_out_type) { | 3111 | case AUTO_PIN_HP_OUT: |
3010 | case AUTO_PIN_HP_OUT: | 3112 | name = "Headphone"; |
3011 | name = "Headphone"; | 3113 | idx = i; |
3012 | break; | 3114 | break; |
3013 | case AUTO_PIN_SPEAKER_OUT: | 3115 | case AUTO_PIN_SPEAKER_OUT: |
3014 | name = "Speaker"; | 3116 | name = "Speaker"; |
3015 | break; | 3117 | idx = i; |
3016 | } | 3118 | break; |
3119 | default: | ||
3120 | name = chname[i]; | ||
3121 | idx = 0; | ||
3122 | break; | ||
3017 | } | 3123 | } |
3018 | err = create_controls(spec, name, nid, 3); | 3124 | err = create_controls_idx(codec, name, idx, nid, 3); |
3019 | if (err < 0) | 3125 | if (err < 0) |
3020 | return err; | 3126 | return err; |
3021 | } | 3127 | } |
3022 | } | 3128 | } |
3129 | return 0; | ||
3130 | } | ||
3131 | |||
3132 | /* add playback controls from the parsed DAC table */ | ||
3133 | static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | ||
3134 | const struct auto_pin_cfg *cfg) | ||
3135 | { | ||
3136 | struct sigmatel_spec *spec = codec->spec; | ||
3137 | int err; | ||
3138 | |||
3139 | err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins, | ||
3140 | spec->multiout.dac_nids, | ||
3141 | cfg->line_out_type); | ||
3142 | if (err < 0) | ||
3143 | return err; | ||
3023 | 3144 | ||
3024 | if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { | 3145 | if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { |
3025 | err = stac92xx_add_control(spec, | 3146 | err = stac92xx_add_control(spec, |
@@ -3054,40 +3175,18 @@ static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec, | |||
3054 | struct auto_pin_cfg *cfg) | 3175 | struct auto_pin_cfg *cfg) |
3055 | { | 3176 | { |
3056 | struct sigmatel_spec *spec = codec->spec; | 3177 | struct sigmatel_spec *spec = codec->spec; |
3057 | hda_nid_t nid; | 3178 | int err; |
3058 | int i, err, nums; | 3179 | |
3180 | err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins, | ||
3181 | spec->hp_dacs, AUTO_PIN_HP_OUT); | ||
3182 | if (err < 0) | ||
3183 | return err; | ||
3184 | |||
3185 | err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins, | ||
3186 | spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT); | ||
3187 | if (err < 0) | ||
3188 | return err; | ||
3059 | 3189 | ||
3060 | nums = 0; | ||
3061 | for (i = 0; i < cfg->hp_outs; i++) { | ||
3062 | static const char *pfxs[] = { | ||
3063 | "Headphone", "Headphone2", "Headphone3", | ||
3064 | }; | ||
3065 | unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]); | ||
3066 | if (wid_caps & AC_WCAP_UNSOL_CAP) | ||
3067 | spec->hp_detect = 1; | ||
3068 | if (nums >= ARRAY_SIZE(pfxs)) | ||
3069 | continue; | ||
3070 | nid = spec->hp_dacs[i]; | ||
3071 | if (!nid) | ||
3072 | continue; | ||
3073 | err = create_controls(spec, pfxs[nums++], nid, 3); | ||
3074 | if (err < 0) | ||
3075 | return err; | ||
3076 | } | ||
3077 | nums = 0; | ||
3078 | for (i = 0; i < cfg->speaker_outs; i++) { | ||
3079 | static const char *pfxs[] = { | ||
3080 | "Speaker", "External Speaker", "Speaker2", | ||
3081 | }; | ||
3082 | if (nums >= ARRAY_SIZE(pfxs)) | ||
3083 | continue; | ||
3084 | nid = spec->speaker_dacs[i]; | ||
3085 | if (!nid) | ||
3086 | continue; | ||
3087 | err = create_controls(spec, pfxs[nums++], nid, 3); | ||
3088 | if (err < 0) | ||
3089 | return err; | ||
3090 | } | ||
3091 | return 0; | 3190 | return 0; |
3092 | } | 3191 | } |
3093 | 3192 | ||
@@ -3296,11 +3395,7 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, | |||
3296 | unsigned int wcaps; | 3395 | unsigned int wcaps; |
3297 | unsigned int def_conf; | 3396 | unsigned int def_conf; |
3298 | 3397 | ||
3299 | def_conf = snd_hda_codec_read(codec, | 3398 | def_conf = snd_hda_codec_get_pincfg(codec, spec->dmic_nids[i]); |
3300 | spec->dmic_nids[i], | ||
3301 | 0, | ||
3302 | AC_VERB_GET_CONFIG_DEFAULT, | ||
3303 | 0); | ||
3304 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) | 3399 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) |
3305 | continue; | 3400 | continue; |
3306 | 3401 | ||
@@ -3424,6 +3519,7 @@ static void stac92xx_auto_init_hp_out(struct hda_codec *codec) | |||
3424 | static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in) | 3519 | static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in) |
3425 | { | 3520 | { |
3426 | struct sigmatel_spec *spec = codec->spec; | 3521 | struct sigmatel_spec *spec = codec->spec; |
3522 | int hp_swap = 0; | ||
3427 | int err; | 3523 | int err; |
3428 | 3524 | ||
3429 | if ((err = snd_hda_parse_pin_def_config(codec, | 3525 | if ((err = snd_hda_parse_pin_def_config(codec, |
@@ -3451,6 +3547,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3451 | spec->autocfg.line_outs = spec->autocfg.hp_outs; | 3547 | spec->autocfg.line_outs = spec->autocfg.hp_outs; |
3452 | spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; | 3548 | spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; |
3453 | spec->autocfg.hp_outs = 0; | 3549 | spec->autocfg.hp_outs = 0; |
3550 | hp_swap = 1; | ||
3454 | } | 3551 | } |
3455 | if (spec->autocfg.mono_out_pin) { | 3552 | if (spec->autocfg.mono_out_pin) { |
3456 | int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) & | 3553 | int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) & |
@@ -3506,13 +3603,12 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3506 | err = stac92xx_auto_fill_dac_nids(codec); | 3603 | err = stac92xx_auto_fill_dac_nids(codec); |
3507 | if (err < 0) | 3604 | if (err < 0) |
3508 | return err; | 3605 | return err; |
3606 | err = stac92xx_auto_create_multi_out_ctls(codec, | ||
3607 | &spec->autocfg); | ||
3608 | if (err < 0) | ||
3609 | return err; | ||
3509 | } | 3610 | } |
3510 | 3611 | ||
3511 | err = stac92xx_auto_create_multi_out_ctls(codec, &spec->autocfg); | ||
3512 | |||
3513 | if (err < 0) | ||
3514 | return err; | ||
3515 | |||
3516 | /* setup analog beep controls */ | 3612 | /* setup analog beep controls */ |
3517 | if (spec->anabeep_nid > 0) { | 3613 | if (spec->anabeep_nid > 0) { |
3518 | err = stac92xx_auto_create_beep_ctls(codec, | 3614 | err = stac92xx_auto_create_beep_ctls(codec, |
@@ -3545,12 +3641,19 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3545 | #endif | 3641 | #endif |
3546 | 3642 | ||
3547 | err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg); | 3643 | err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg); |
3548 | |||
3549 | if (err < 0) | 3644 | if (err < 0) |
3550 | return err; | 3645 | return err; |
3551 | 3646 | ||
3552 | err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg); | 3647 | /* All output parsing done, now restore the swapped hp pins */ |
3648 | if (hp_swap) { | ||
3649 | memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins, | ||
3650 | sizeof(spec->autocfg.hp_pins)); | ||
3651 | spec->autocfg.hp_outs = spec->autocfg.line_outs; | ||
3652 | spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; | ||
3653 | spec->autocfg.line_outs = 0; | ||
3654 | } | ||
3553 | 3655 | ||
3656 | err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg); | ||
3554 | if (err < 0) | 3657 | if (err < 0) |
3555 | return err; | 3658 | return err; |
3556 | 3659 | ||
@@ -3579,11 +3682,15 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3579 | return err; | 3682 | return err; |
3580 | } | 3683 | } |
3581 | 3684 | ||
3685 | err = stac92xx_add_input_source(spec); | ||
3686 | if (err < 0) | ||
3687 | return err; | ||
3688 | |||
3582 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 3689 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
3583 | if (spec->multiout.max_channels > 2) | 3690 | if (spec->multiout.max_channels > 2) |
3584 | spec->surr_switch = 1; | 3691 | spec->surr_switch = 1; |
3585 | 3692 | ||
3586 | if (spec->autocfg.dig_out_pin) | 3693 | if (spec->autocfg.dig_outs) |
3587 | spec->multiout.dig_out_nid = dig_out; | 3694 | spec->multiout.dig_out_nid = dig_out; |
3588 | if (dig_in && spec->autocfg.dig_in_pin) | 3695 | if (dig_in && spec->autocfg.dig_in_pin) |
3589 | spec->dig_in_nid = dig_in; | 3696 | spec->dig_in_nid = dig_in; |
@@ -3646,9 +3753,7 @@ static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec, | |||
3646 | for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) { | 3753 | for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) { |
3647 | hda_nid_t pin = spec->autocfg.line_out_pins[i]; | 3754 | hda_nid_t pin = spec->autocfg.line_out_pins[i]; |
3648 | unsigned int defcfg; | 3755 | unsigned int defcfg; |
3649 | defcfg = snd_hda_codec_read(codec, pin, 0, | 3756 | defcfg = snd_hda_codec_get_pincfg(codec, pin); |
3650 | AC_VERB_GET_CONFIG_DEFAULT, | ||
3651 | 0x00); | ||
3652 | if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) { | 3757 | if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) { |
3653 | unsigned int wcaps = get_wcaps(codec, pin); | 3758 | unsigned int wcaps = get_wcaps(codec, pin); |
3654 | wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP); | 3759 | wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP); |
@@ -3661,7 +3766,7 @@ static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec, | |||
3661 | } | 3766 | } |
3662 | 3767 | ||
3663 | if (lfe_pin) { | 3768 | if (lfe_pin) { |
3664 | err = create_controls(spec, "LFE", lfe_pin, 1); | 3769 | err = create_controls(codec, "LFE", lfe_pin, 1); |
3665 | if (err < 0) | 3770 | if (err < 0) |
3666 | return err; | 3771 | return err; |
3667 | } | 3772 | } |
@@ -3692,7 +3797,11 @@ static int stac9200_parse_auto_config(struct hda_codec *codec) | |||
3692 | return err; | 3797 | return err; |
3693 | } | 3798 | } |
3694 | 3799 | ||
3695 | if (spec->autocfg.dig_out_pin) | 3800 | err = stac92xx_add_input_source(spec); |
3801 | if (err < 0) | ||
3802 | return err; | ||
3803 | |||
3804 | if (spec->autocfg.dig_outs) | ||
3696 | spec->multiout.dig_out_nid = 0x05; | 3805 | spec->multiout.dig_out_nid = 0x05; |
3697 | if (spec->autocfg.dig_in_pin) | 3806 | if (spec->autocfg.dig_in_pin) |
3698 | spec->dig_in_nid = 0x04; | 3807 | spec->dig_in_nid = 0x04; |
@@ -3742,16 +3851,25 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask, | |||
3742 | AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ | 3851 | AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ |
3743 | } | 3852 | } |
3744 | 3853 | ||
3854 | #ifdef CONFIG_SND_JACK | ||
3855 | static void stac92xx_free_jack_priv(struct snd_jack *jack) | ||
3856 | { | ||
3857 | struct sigmatel_jack *jacks = jack->private_data; | ||
3858 | jacks->nid = 0; | ||
3859 | jacks->jack = NULL; | ||
3860 | } | ||
3861 | #endif | ||
3862 | |||
3745 | static int stac92xx_add_jack(struct hda_codec *codec, | 3863 | static int stac92xx_add_jack(struct hda_codec *codec, |
3746 | hda_nid_t nid, int type) | 3864 | hda_nid_t nid, int type) |
3747 | { | 3865 | { |
3748 | #ifdef CONFIG_SND_JACK | 3866 | #ifdef CONFIG_SND_JACK |
3749 | struct sigmatel_spec *spec = codec->spec; | 3867 | struct sigmatel_spec *spec = codec->spec; |
3750 | struct sigmatel_jack *jack; | 3868 | struct sigmatel_jack *jack; |
3751 | int def_conf = snd_hda_codec_read(codec, nid, | 3869 | int def_conf = snd_hda_codec_get_pincfg(codec, nid); |
3752 | 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3753 | int connectivity = get_defcfg_connect(def_conf); | 3870 | int connectivity = get_defcfg_connect(def_conf); |
3754 | char name[32]; | 3871 | char name[32]; |
3872 | int err; | ||
3755 | 3873 | ||
3756 | if (connectivity && connectivity != AC_JACK_PORT_FIXED) | 3874 | if (connectivity && connectivity != AC_JACK_PORT_FIXED) |
3757 | return 0; | 3875 | return 0; |
@@ -3768,10 +3886,15 @@ static int stac92xx_add_jack(struct hda_codec *codec, | |||
3768 | snd_hda_get_jack_connectivity(def_conf), | 3886 | snd_hda_get_jack_connectivity(def_conf), |
3769 | snd_hda_get_jack_location(def_conf)); | 3887 | snd_hda_get_jack_location(def_conf)); |
3770 | 3888 | ||
3771 | return snd_jack_new(codec->bus->card, name, type, &jack->jack); | 3889 | err = snd_jack_new(codec->bus->card, name, type, &jack->jack); |
3772 | #else | 3890 | if (err < 0) { |
3773 | return 0; | 3891 | jack->nid = 0; |
3892 | return err; | ||
3893 | } | ||
3894 | jack->jack->private_data = jack; | ||
3895 | jack->jack->private_free = stac92xx_free_jack_priv; | ||
3774 | #endif | 3896 | #endif |
3897 | return 0; | ||
3775 | } | 3898 | } |
3776 | 3899 | ||
3777 | static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, | 3900 | static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, |
@@ -3864,6 +3987,36 @@ static void stac92xx_power_down(struct hda_codec *codec) | |||
3864 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, | 3987 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, |
3865 | int enable); | 3988 | int enable); |
3866 | 3989 | ||
3990 | /* override some hints from the hwdep entry */ | ||
3991 | static void stac_store_hints(struct hda_codec *codec) | ||
3992 | { | ||
3993 | struct sigmatel_spec *spec = codec->spec; | ||
3994 | const char *p; | ||
3995 | int val; | ||
3996 | |||
3997 | val = snd_hda_get_bool_hint(codec, "hp_detect"); | ||
3998 | if (val >= 0) | ||
3999 | spec->hp_detect = val; | ||
4000 | p = snd_hda_get_hint(codec, "gpio_mask"); | ||
4001 | if (p) { | ||
4002 | spec->gpio_mask = simple_strtoul(p, NULL, 0); | ||
4003 | spec->eapd_mask = spec->gpio_dir = spec->gpio_data = | ||
4004 | spec->gpio_mask; | ||
4005 | } | ||
4006 | p = snd_hda_get_hint(codec, "gpio_dir"); | ||
4007 | if (p) | ||
4008 | spec->gpio_dir = simple_strtoul(p, NULL, 0) & spec->gpio_mask; | ||
4009 | p = snd_hda_get_hint(codec, "gpio_data"); | ||
4010 | if (p) | ||
4011 | spec->gpio_data = simple_strtoul(p, NULL, 0) & spec->gpio_mask; | ||
4012 | p = snd_hda_get_hint(codec, "eapd_mask"); | ||
4013 | if (p) | ||
4014 | spec->eapd_mask = simple_strtoul(p, NULL, 0) & spec->gpio_mask; | ||
4015 | val = snd_hda_get_bool_hint(codec, "eapd_switch"); | ||
4016 | if (val >= 0) | ||
4017 | spec->eapd_switch = val; | ||
4018 | } | ||
4019 | |||
3867 | static int stac92xx_init(struct hda_codec *codec) | 4020 | static int stac92xx_init(struct hda_codec *codec) |
3868 | { | 4021 | { |
3869 | struct sigmatel_spec *spec = codec->spec; | 4022 | struct sigmatel_spec *spec = codec->spec; |
@@ -3880,6 +4033,9 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3880 | spec->adc_nids[i], 0, | 4033 | spec->adc_nids[i], 0, |
3881 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 4034 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
3882 | 4035 | ||
4036 | /* override some hints */ | ||
4037 | stac_store_hints(codec); | ||
4038 | |||
3883 | /* set up GPIO */ | 4039 | /* set up GPIO */ |
3884 | gpio = spec->gpio_data; | 4040 | gpio = spec->gpio_data; |
3885 | /* turn on EAPD statically when spec->eapd_switch isn't set. | 4041 | /* turn on EAPD statically when spec->eapd_switch isn't set. |
@@ -3929,8 +4085,7 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3929 | pinctl); | 4085 | pinctl); |
3930 | } | 4086 | } |
3931 | } | 4087 | } |
3932 | conf = snd_hda_codec_read(codec, nid, 0, | 4088 | conf = snd_hda_codec_get_pincfg(codec, nid); |
3933 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3934 | if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { | 4089 | if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { |
3935 | enable_pin_detect(codec, nid, | 4090 | enable_pin_detect(codec, nid, |
3936 | STAC_INSERT_EVENT); | 4091 | STAC_INSERT_EVENT); |
@@ -3942,8 +4097,8 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3942 | for (i = 0; i < spec->num_dmics; i++) | 4097 | for (i = 0; i < spec->num_dmics; i++) |
3943 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], | 4098 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], |
3944 | AC_PINCTL_IN_EN); | 4099 | AC_PINCTL_IN_EN); |
3945 | if (cfg->dig_out_pin) | 4100 | if (cfg->dig_out_pins[0]) |
3946 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | 4101 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0], |
3947 | AC_PINCTL_OUT_EN); | 4102 | AC_PINCTL_OUT_EN); |
3948 | if (cfg->dig_in_pin) | 4103 | if (cfg->dig_in_pin) |
3949 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | 4104 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, |
@@ -3971,8 +4126,7 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3971 | stac_toggle_power_map(codec, nid, 1); | 4126 | stac_toggle_power_map(codec, nid, 1); |
3972 | continue; | 4127 | continue; |
3973 | } | 4128 | } |
3974 | def_conf = snd_hda_codec_read(codec, nid, 0, | 4129 | def_conf = snd_hda_codec_get_pincfg(codec, nid); |
3975 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3976 | def_conf = get_defcfg_connect(def_conf); | 4130 | def_conf = get_defcfg_connect(def_conf); |
3977 | /* skip any ports that don't have jacks since presence | 4131 | /* skip any ports that don't have jacks since presence |
3978 | * detection is useless */ | 4132 | * detection is useless */ |
@@ -3999,8 +4153,10 @@ static void stac92xx_free_jacks(struct hda_codec *codec) | |||
3999 | if (!codec->bus->shutdown && spec->jacks.list) { | 4153 | if (!codec->bus->shutdown && spec->jacks.list) { |
4000 | struct sigmatel_jack *jacks = spec->jacks.list; | 4154 | struct sigmatel_jack *jacks = spec->jacks.list; |
4001 | int i; | 4155 | int i; |
4002 | for (i = 0; i < spec->jacks.used; i++) | 4156 | for (i = 0; i < spec->jacks.used; i++, jacks++) { |
4003 | snd_device_free(codec->bus->card, &jacks[i].jack); | 4157 | if (jacks->jack) |
4158 | snd_device_free(codec->bus->card, jacks->jack); | ||
4159 | } | ||
4004 | } | 4160 | } |
4005 | snd_array_free(&spec->jacks); | 4161 | snd_array_free(&spec->jacks); |
4006 | #endif | 4162 | #endif |
@@ -4026,7 +4182,6 @@ static void stac92xx_free(struct hda_codec *codec) | |||
4026 | if (! spec) | 4182 | if (! spec) |
4027 | return; | 4183 | return; |
4028 | 4184 | ||
4029 | kfree(spec->pin_configs); | ||
4030 | stac92xx_free_jacks(codec); | 4185 | stac92xx_free_jacks(codec); |
4031 | snd_array_free(&spec->events); | 4186 | snd_array_free(&spec->events); |
4032 | 4187 | ||
@@ -4037,7 +4192,9 @@ static void stac92xx_free(struct hda_codec *codec) | |||
4037 | static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, | 4192 | static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, |
4038 | unsigned int flag) | 4193 | unsigned int flag) |
4039 | { | 4194 | { |
4040 | unsigned int pin_ctl = snd_hda_codec_read(codec, nid, | 4195 | unsigned int old_ctl, pin_ctl; |
4196 | |||
4197 | pin_ctl = snd_hda_codec_read(codec, nid, | ||
4041 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); | 4198 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); |
4042 | 4199 | ||
4043 | if (pin_ctl & AC_PINCTL_IN_EN) { | 4200 | if (pin_ctl & AC_PINCTL_IN_EN) { |
@@ -4051,14 +4208,17 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, | |||
4051 | return; | 4208 | return; |
4052 | } | 4209 | } |
4053 | 4210 | ||
4211 | old_ctl = pin_ctl; | ||
4054 | /* if setting pin direction bits, clear the current | 4212 | /* if setting pin direction bits, clear the current |
4055 | direction bits first */ | 4213 | direction bits first */ |
4056 | if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)) | 4214 | if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)) |
4057 | pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); | 4215 | pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); |
4058 | 4216 | ||
4059 | snd_hda_codec_write_cache(codec, nid, 0, | 4217 | pin_ctl |= flag; |
4060 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 4218 | if (old_ctl != pin_ctl) |
4061 | pin_ctl | flag); | 4219 | snd_hda_codec_write_cache(codec, nid, 0, |
4220 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
4221 | pin_ctl); | ||
4062 | } | 4222 | } |
4063 | 4223 | ||
4064 | static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, | 4224 | static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, |
@@ -4066,9 +4226,10 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, | |||
4066 | { | 4226 | { |
4067 | unsigned int pin_ctl = snd_hda_codec_read(codec, nid, | 4227 | unsigned int pin_ctl = snd_hda_codec_read(codec, nid, |
4068 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); | 4228 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); |
4069 | snd_hda_codec_write_cache(codec, nid, 0, | 4229 | if (pin_ctl & flag) |
4070 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 4230 | snd_hda_codec_write_cache(codec, nid, 0, |
4071 | pin_ctl & ~flag); | 4231 | AC_VERB_SET_PIN_WIDGET_CONTROL, |
4232 | pin_ctl & ~flag); | ||
4072 | } | 4233 | } |
4073 | 4234 | ||
4074 | static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) | 4235 | static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) |
@@ -4163,8 +4324,19 @@ static void stac92xx_hp_detect(struct hda_codec *codec) | |||
4163 | continue; | 4324 | continue; |
4164 | if (presence) | 4325 | if (presence) |
4165 | stac92xx_set_pinctl(codec, cfg->hp_pins[i], val); | 4326 | stac92xx_set_pinctl(codec, cfg->hp_pins[i], val); |
4327 | #if 0 /* FIXME */ | ||
4328 | /* Resetting the pinctl like below may lead to (a sort of) regressions | ||
4329 | * on some devices since they use the HP pin actually for line/speaker | ||
4330 | * outs although the default pin config shows a different pin (that is | ||
4331 | * wrong and useless). | ||
4332 | * | ||
4333 | * So, it's basically a problem of default pin configs, likely a BIOS issue. | ||
4334 | * But, disabling the code below just works around it, and I'm too tired of | ||
4335 | * bug reports with such devices... | ||
4336 | */ | ||
4166 | else | 4337 | else |
4167 | stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val); | 4338 | stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val); |
4339 | #endif /* FIXME */ | ||
4168 | } | 4340 | } |
4169 | } | 4341 | } |
4170 | 4342 | ||
@@ -4258,6 +4430,24 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | |||
4258 | if (spec->num_pwrs > 0) | 4430 | if (spec->num_pwrs > 0) |
4259 | stac92xx_pin_sense(codec, event->nid); | 4431 | stac92xx_pin_sense(codec, event->nid); |
4260 | stac92xx_report_jack(codec, event->nid); | 4432 | stac92xx_report_jack(codec, event->nid); |
4433 | |||
4434 | switch (codec->subsystem_id) { | ||
4435 | case 0x103c308f: | ||
4436 | if (event->nid == 0xb) { | ||
4437 | int pin = AC_PINCTL_IN_EN; | ||
4438 | |||
4439 | if (get_pin_presence(codec, 0xa) | ||
4440 | && get_pin_presence(codec, 0xb)) | ||
4441 | pin |= AC_PINCTL_VREF_80; | ||
4442 | if (!get_pin_presence(codec, 0xb)) | ||
4443 | pin |= AC_PINCTL_VREF_80; | ||
4444 | |||
4445 | /* toggle VREF state based on mic + hp pin | ||
4446 | * status | ||
4447 | */ | ||
4448 | stac92xx_auto_set_pinctl(codec, 0x0a, pin); | ||
4449 | } | ||
4450 | } | ||
4261 | break; | 4451 | break; |
4262 | case STAC_VREF_EVENT: | 4452 | case STAC_VREF_EVENT: |
4263 | data = snd_hda_codec_read(codec, codec->afg, 0, | 4453 | data = snd_hda_codec_read(codec, codec->afg, 0, |
@@ -4320,7 +4510,6 @@ static int stac92xx_resume(struct hda_codec *codec) | |||
4320 | { | 4510 | { |
4321 | struct sigmatel_spec *spec = codec->spec; | 4511 | struct sigmatel_spec *spec = codec->spec; |
4322 | 4512 | ||
4323 | stac92xx_set_config_regs(codec); | ||
4324 | stac92xx_init(codec); | 4513 | stac92xx_init(codec); |
4325 | snd_hda_codec_resume_amp(codec); | 4514 | snd_hda_codec_resume_amp(codec); |
4326 | snd_hda_codec_resume_cache(codec); | 4515 | snd_hda_codec_resume_cache(codec); |
@@ -4331,6 +4520,37 @@ static int stac92xx_resume(struct hda_codec *codec) | |||
4331 | return 0; | 4520 | return 0; |
4332 | } | 4521 | } |
4333 | 4522 | ||
4523 | |||
4524 | /* | ||
4525 | * using power check for controlling mute led of HP HDX notebooks | ||
4526 | * check for mute state only on Speakers (nid = 0x10) | ||
4527 | * | ||
4528 | * For this feature CONFIG_SND_HDA_POWER_SAVE is needed, otherwise | ||
4529 | * the LED is NOT working properly ! | ||
4530 | */ | ||
4531 | |||
4532 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
4533 | static int stac92xx_hp_hdx_check_power_status(struct hda_codec *codec, | ||
4534 | hda_nid_t nid) | ||
4535 | { | ||
4536 | struct sigmatel_spec *spec = codec->spec; | ||
4537 | |||
4538 | if (nid == 0x10) { | ||
4539 | if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & | ||
4540 | HDA_AMP_MUTE) | ||
4541 | spec->gpio_data &= ~0x08; /* orange */ | ||
4542 | else | ||
4543 | spec->gpio_data |= 0x08; /* white */ | ||
4544 | |||
4545 | stac_gpio_set(codec, spec->gpio_mask, | ||
4546 | spec->gpio_dir, | ||
4547 | spec->gpio_data); | ||
4548 | } | ||
4549 | |||
4550 | return 0; | ||
4551 | } | ||
4552 | #endif | ||
4553 | |||
4334 | static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) | 4554 | static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) |
4335 | { | 4555 | { |
4336 | struct sigmatel_spec *spec = codec->spec; | 4556 | struct sigmatel_spec *spec = codec->spec; |
@@ -4369,16 +4589,11 @@ static int patch_stac9200(struct hda_codec *codec) | |||
4369 | spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS, | 4589 | spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS, |
4370 | stac9200_models, | 4590 | stac9200_models, |
4371 | stac9200_cfg_tbl); | 4591 | stac9200_cfg_tbl); |
4372 | if (spec->board_config < 0) { | 4592 | if (spec->board_config < 0) |
4373 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n"); | 4593 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n"); |
4374 | err = stac92xx_save_bios_config_regs(codec); | 4594 | else |
4375 | } else | 4595 | stac92xx_set_config_regs(codec, |
4376 | err = stac_save_pin_cfgs(codec, | ||
4377 | stac9200_brd_tbl[spec->board_config]); | 4596 | stac9200_brd_tbl[spec->board_config]); |
4378 | if (err < 0) { | ||
4379 | stac92xx_free(codec); | ||
4380 | return err; | ||
4381 | } | ||
4382 | 4597 | ||
4383 | spec->multiout.max_channels = 2; | 4598 | spec->multiout.max_channels = 2; |
4384 | spec->multiout.num_dacs = 1; | 4599 | spec->multiout.num_dacs = 1; |
@@ -4390,7 +4605,8 @@ static int patch_stac9200(struct hda_codec *codec) | |||
4390 | spec->num_adcs = 1; | 4605 | spec->num_adcs = 1; |
4391 | spec->num_pwrs = 0; | 4606 | spec->num_pwrs = 0; |
4392 | 4607 | ||
4393 | if (spec->board_config == STAC_9200_GATEWAY || | 4608 | if (spec->board_config == STAC_9200_M4 || |
4609 | spec->board_config == STAC_9200_M4_2 || | ||
4394 | spec->board_config == STAC_9200_OQO) | 4610 | spec->board_config == STAC_9200_OQO) |
4395 | spec->init = stac9200_eapd_init; | 4611 | spec->init = stac9200_eapd_init; |
4396 | else | 4612 | else |
@@ -4408,6 +4624,12 @@ static int patch_stac9200(struct hda_codec *codec) | |||
4408 | return err; | 4624 | return err; |
4409 | } | 4625 | } |
4410 | 4626 | ||
4627 | /* CF-74 has no headphone detection, and the driver should *NOT* | ||
4628 | * do detection and HP/speaker toggle because the hardware does it. | ||
4629 | */ | ||
4630 | if (spec->board_config == STAC_9200_PANASONIC) | ||
4631 | spec->hp_detect = 0; | ||
4632 | |||
4411 | codec->patch_ops = stac92xx_patch_ops; | 4633 | codec->patch_ops = stac92xx_patch_ops; |
4412 | 4634 | ||
4413 | return 0; | 4635 | return 0; |
@@ -4425,21 +4647,26 @@ static int patch_stac925x(struct hda_codec *codec) | |||
4425 | codec->spec = spec; | 4647 | codec->spec = spec; |
4426 | spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); | 4648 | spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); |
4427 | spec->pin_nids = stac925x_pin_nids; | 4649 | spec->pin_nids = stac925x_pin_nids; |
4428 | spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS, | 4650 | |
4651 | /* Check first for codec ID */ | ||
4652 | spec->board_config = snd_hda_check_board_codec_sid_config(codec, | ||
4653 | STAC_925x_MODELS, | ||
4654 | stac925x_models, | ||
4655 | stac925x_codec_id_cfg_tbl); | ||
4656 | |||
4657 | /* Now checks for PCI ID, if codec ID is not found */ | ||
4658 | if (spec->board_config < 0) | ||
4659 | spec->board_config = snd_hda_check_board_config(codec, | ||
4660 | STAC_925x_MODELS, | ||
4429 | stac925x_models, | 4661 | stac925x_models, |
4430 | stac925x_cfg_tbl); | 4662 | stac925x_cfg_tbl); |
4431 | again: | 4663 | again: |
4432 | if (spec->board_config < 0) { | 4664 | if (spec->board_config < 0) |
4433 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x," | 4665 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x," |
4434 | "using BIOS defaults\n"); | 4666 | "using BIOS defaults\n"); |
4435 | err = stac92xx_save_bios_config_regs(codec); | 4667 | else |
4436 | } else | 4668 | stac92xx_set_config_regs(codec, |
4437 | err = stac_save_pin_cfgs(codec, | ||
4438 | stac925x_brd_tbl[spec->board_config]); | 4669 | stac925x_brd_tbl[spec->board_config]); |
4439 | if (err < 0) { | ||
4440 | stac92xx_free(codec); | ||
4441 | return err; | ||
4442 | } | ||
4443 | 4670 | ||
4444 | spec->multiout.max_channels = 2; | 4671 | spec->multiout.max_channels = 2; |
4445 | spec->multiout.num_dacs = 1; | 4672 | spec->multiout.num_dacs = 1; |
@@ -4517,17 +4744,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec) | |||
4517 | stac92hd73xx_models, | 4744 | stac92hd73xx_models, |
4518 | stac92hd73xx_cfg_tbl); | 4745 | stac92hd73xx_cfg_tbl); |
4519 | again: | 4746 | again: |
4520 | if (spec->board_config < 0) { | 4747 | if (spec->board_config < 0) |
4521 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" | 4748 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" |
4522 | " STAC92HD73XX, using BIOS defaults\n"); | 4749 | " STAC92HD73XX, using BIOS defaults\n"); |
4523 | err = stac92xx_save_bios_config_regs(codec); | 4750 | else |
4524 | } else | 4751 | stac92xx_set_config_regs(codec, |
4525 | err = stac_save_pin_cfgs(codec, | ||
4526 | stac92hd73xx_brd_tbl[spec->board_config]); | 4752 | stac92hd73xx_brd_tbl[spec->board_config]); |
4527 | if (err < 0) { | ||
4528 | stac92xx_free(codec); | ||
4529 | return err; | ||
4530 | } | ||
4531 | 4753 | ||
4532 | num_dacs = snd_hda_get_connections(codec, 0x0a, | 4754 | num_dacs = snd_hda_get_connections(codec, 0x0a, |
4533 | conn, STAC92HD73_DAC_COUNT + 2) - 1; | 4755 | conn, STAC92HD73_DAC_COUNT + 2) - 1; |
@@ -4541,14 +4763,18 @@ again: | |||
4541 | case 0x3: /* 6 Channel */ | 4763 | case 0x3: /* 6 Channel */ |
4542 | spec->mixer = stac92hd73xx_6ch_mixer; | 4764 | spec->mixer = stac92hd73xx_6ch_mixer; |
4543 | spec->init = stac92hd73xx_6ch_core_init; | 4765 | spec->init = stac92hd73xx_6ch_core_init; |
4766 | spec->aloopback_ctl = stac92hd73xx_6ch_loopback; | ||
4544 | break; | 4767 | break; |
4545 | case 0x4: /* 8 Channel */ | 4768 | case 0x4: /* 8 Channel */ |
4546 | spec->mixer = stac92hd73xx_8ch_mixer; | 4769 | spec->mixer = stac92hd73xx_8ch_mixer; |
4547 | spec->init = stac92hd73xx_8ch_core_init; | 4770 | spec->init = stac92hd73xx_8ch_core_init; |
4771 | spec->aloopback_ctl = stac92hd73xx_8ch_loopback; | ||
4548 | break; | 4772 | break; |
4549 | case 0x5: /* 10 Channel */ | 4773 | case 0x5: /* 10 Channel */ |
4550 | spec->mixer = stac92hd73xx_10ch_mixer; | 4774 | spec->mixer = stac92hd73xx_10ch_mixer; |
4551 | spec->init = stac92hd73xx_10ch_core_init; | 4775 | spec->init = stac92hd73xx_10ch_core_init; |
4776 | spec->aloopback_ctl = stac92hd73xx_10ch_loopback; | ||
4777 | break; | ||
4552 | } | 4778 | } |
4553 | spec->multiout.dac_nids = spec->dac_nids; | 4779 | spec->multiout.dac_nids = spec->dac_nids; |
4554 | 4780 | ||
@@ -4587,18 +4813,18 @@ again: | |||
4587 | spec->init = dell_m6_core_init; | 4813 | spec->init = dell_m6_core_init; |
4588 | switch (spec->board_config) { | 4814 | switch (spec->board_config) { |
4589 | case STAC_DELL_M6_AMIC: /* Analog Mics */ | 4815 | case STAC_DELL_M6_AMIC: /* Analog Mics */ |
4590 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4816 | snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); |
4591 | spec->num_dmics = 0; | 4817 | spec->num_dmics = 0; |
4592 | spec->private_dimux.num_items = 1; | 4818 | spec->private_dimux.num_items = 1; |
4593 | break; | 4819 | break; |
4594 | case STAC_DELL_M6_DMIC: /* Digital Mics */ | 4820 | case STAC_DELL_M6_DMIC: /* Digital Mics */ |
4595 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4821 | snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); |
4596 | spec->num_dmics = 1; | 4822 | spec->num_dmics = 1; |
4597 | spec->private_dimux.num_items = 2; | 4823 | spec->private_dimux.num_items = 2; |
4598 | break; | 4824 | break; |
4599 | case STAC_DELL_M6_BOTH: /* Both */ | 4825 | case STAC_DELL_M6_BOTH: /* Both */ |
4600 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4826 | snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); |
4601 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4827 | snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); |
4602 | spec->num_dmics = 1; | 4828 | spec->num_dmics = 1; |
4603 | spec->private_dimux.num_items = 2; | 4829 | spec->private_dimux.num_items = 2; |
4604 | break; | 4830 | break; |
@@ -4658,7 +4884,10 @@ static struct hda_input_mux stac92hd83xxx_dmux = { | |||
4658 | static int patch_stac92hd83xxx(struct hda_codec *codec) | 4884 | static int patch_stac92hd83xxx(struct hda_codec *codec) |
4659 | { | 4885 | { |
4660 | struct sigmatel_spec *spec; | 4886 | struct sigmatel_spec *spec; |
4887 | hda_nid_t conn[STAC92HD83_DAC_COUNT + 1]; | ||
4661 | int err; | 4888 | int err; |
4889 | int num_dacs; | ||
4890 | hda_nid_t nid; | ||
4662 | 4891 | ||
4663 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 4892 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
4664 | if (spec == NULL) | 4893 | if (spec == NULL) |
@@ -4672,23 +4901,17 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
4672 | spec->dmux_nids = stac92hd83xxx_dmux_nids; | 4901 | spec->dmux_nids = stac92hd83xxx_dmux_nids; |
4673 | spec->adc_nids = stac92hd83xxx_adc_nids; | 4902 | spec->adc_nids = stac92hd83xxx_adc_nids; |
4674 | spec->pwr_nids = stac92hd83xxx_pwr_nids; | 4903 | spec->pwr_nids = stac92hd83xxx_pwr_nids; |
4904 | spec->amp_nids = stac92hd83xxx_amp_nids; | ||
4675 | spec->pwr_mapping = stac92hd83xxx_pwr_mapping; | 4905 | spec->pwr_mapping = stac92hd83xxx_pwr_mapping; |
4676 | spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); | 4906 | spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); |
4677 | spec->multiout.dac_nids = spec->dac_nids; | 4907 | spec->multiout.dac_nids = spec->dac_nids; |
4678 | 4908 | ||
4679 | spec->init = stac92hd83xxx_core_init; | 4909 | spec->init = stac92hd83xxx_core_init; |
4680 | switch (codec->vendor_id) { | ||
4681 | case 0x111d7605: | ||
4682 | break; | ||
4683 | default: | ||
4684 | spec->num_pwrs--; | ||
4685 | spec->init++; /* switch to config #2 */ | ||
4686 | } | ||
4687 | |||
4688 | spec->mixer = stac92hd83xxx_mixer; | 4910 | spec->mixer = stac92hd83xxx_mixer; |
4689 | spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids); | 4911 | spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids); |
4690 | spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids); | 4912 | spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids); |
4691 | spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids); | 4913 | spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids); |
4914 | spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids); | ||
4692 | spec->num_dmics = STAC92HD83XXX_NUM_DMICS; | 4915 | spec->num_dmics = STAC92HD83XXX_NUM_DMICS; |
4693 | spec->dinput_mux = &stac92hd83xxx_dmux; | 4916 | spec->dinput_mux = &stac92hd83xxx_dmux; |
4694 | spec->pin_nids = stac92hd83xxx_pin_nids; | 4917 | spec->pin_nids = stac92hd83xxx_pin_nids; |
@@ -4697,16 +4920,21 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
4697 | stac92hd83xxx_models, | 4920 | stac92hd83xxx_models, |
4698 | stac92hd83xxx_cfg_tbl); | 4921 | stac92hd83xxx_cfg_tbl); |
4699 | again: | 4922 | again: |
4700 | if (spec->board_config < 0) { | 4923 | if (spec->board_config < 0) |
4701 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" | 4924 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" |
4702 | " STAC92HD83XXX, using BIOS defaults\n"); | 4925 | " STAC92HD83XXX, using BIOS defaults\n"); |
4703 | err = stac92xx_save_bios_config_regs(codec); | 4926 | else |
4704 | } else | 4927 | stac92xx_set_config_regs(codec, |
4705 | err = stac_save_pin_cfgs(codec, | ||
4706 | stac92hd83xxx_brd_tbl[spec->board_config]); | 4928 | stac92hd83xxx_brd_tbl[spec->board_config]); |
4707 | if (err < 0) { | 4929 | |
4708 | stac92xx_free(codec); | 4930 | switch (codec->vendor_id) { |
4709 | return err; | 4931 | case 0x111d7604: |
4932 | case 0x111d7605: | ||
4933 | case 0x111d76d5: | ||
4934 | if (spec->board_config == STAC_92HD83XXX_PWR_REF) | ||
4935 | break; | ||
4936 | spec->num_pwrs = 0; | ||
4937 | break; | ||
4710 | } | 4938 | } |
4711 | 4939 | ||
4712 | err = stac92xx_parse_auto_config(codec, 0x1d, 0); | 4940 | err = stac92xx_parse_auto_config(codec, 0x1d, 0); |
@@ -4725,6 +4953,23 @@ again: | |||
4725 | return err; | 4953 | return err; |
4726 | } | 4954 | } |
4727 | 4955 | ||
4956 | switch (spec->board_config) { | ||
4957 | case STAC_DELL_S14: | ||
4958 | nid = 0xf; | ||
4959 | break; | ||
4960 | default: | ||
4961 | nid = 0xe; | ||
4962 | break; | ||
4963 | } | ||
4964 | |||
4965 | num_dacs = snd_hda_get_connections(codec, nid, | ||
4966 | conn, STAC92HD83_DAC_COUNT + 1) - 1; | ||
4967 | |||
4968 | /* set port X to select the last DAC | ||
4969 | */ | ||
4970 | snd_hda_codec_write_cache(codec, nid, 0, | ||
4971 | AC_VERB_SET_CONNECT_SEL, num_dacs); | ||
4972 | |||
4728 | codec->patch_ops = stac92xx_patch_ops; | 4973 | codec->patch_ops = stac92xx_patch_ops; |
4729 | 4974 | ||
4730 | codec->proc_widget_hook = stac92hd_proc_hook; | 4975 | codec->proc_widget_hook = stac92hd_proc_hook; |
@@ -4732,7 +4977,16 @@ again: | |||
4732 | return 0; | 4977 | return 0; |
4733 | } | 4978 | } |
4734 | 4979 | ||
4735 | static struct hda_input_mux stac92hd71bxx_dmux = { | 4980 | static struct hda_input_mux stac92hd71bxx_dmux_nomixer = { |
4981 | .num_items = 3, | ||
4982 | .items = { | ||
4983 | { "Analog Inputs", 0x00 }, | ||
4984 | { "Digital Mic 1", 0x02 }, | ||
4985 | { "Digital Mic 2", 0x03 }, | ||
4986 | } | ||
4987 | }; | ||
4988 | |||
4989 | static struct hda_input_mux stac92hd71bxx_dmux_amixer = { | ||
4736 | .num_items = 4, | 4990 | .num_items = 4, |
4737 | .items = { | 4991 | .items = { |
4738 | { "Analog Inputs", 0x00 }, | 4992 | { "Analog Inputs", 0x00 }, |
@@ -4742,10 +4996,67 @@ static struct hda_input_mux stac92hd71bxx_dmux = { | |||
4742 | } | 4996 | } |
4743 | }; | 4997 | }; |
4744 | 4998 | ||
4999 | /* get the pin connection (fixed, none, etc) */ | ||
5000 | static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx) | ||
5001 | { | ||
5002 | struct sigmatel_spec *spec = codec->spec; | ||
5003 | unsigned int cfg; | ||
5004 | |||
5005 | cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]); | ||
5006 | return get_defcfg_connect(cfg); | ||
5007 | } | ||
5008 | |||
5009 | static int stac92hd71bxx_connected_ports(struct hda_codec *codec, | ||
5010 | hda_nid_t *nids, int num_nids) | ||
5011 | { | ||
5012 | struct sigmatel_spec *spec = codec->spec; | ||
5013 | int idx, num; | ||
5014 | unsigned int def_conf; | ||
5015 | |||
5016 | for (num = 0; num < num_nids; num++) { | ||
5017 | for (idx = 0; idx < spec->num_pins; idx++) | ||
5018 | if (spec->pin_nids[idx] == nids[num]) | ||
5019 | break; | ||
5020 | if (idx >= spec->num_pins) | ||
5021 | break; | ||
5022 | def_conf = stac_get_defcfg_connect(codec, idx); | ||
5023 | if (def_conf == AC_JACK_PORT_NONE) | ||
5024 | break; | ||
5025 | } | ||
5026 | return num; | ||
5027 | } | ||
5028 | |||
5029 | static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec, | ||
5030 | hda_nid_t dig0pin) | ||
5031 | { | ||
5032 | struct sigmatel_spec *spec = codec->spec; | ||
5033 | int idx; | ||
5034 | |||
5035 | for (idx = 0; idx < spec->num_pins; idx++) | ||
5036 | if (spec->pin_nids[idx] == dig0pin) | ||
5037 | break; | ||
5038 | if ((idx + 2) >= spec->num_pins) | ||
5039 | return 0; | ||
5040 | |||
5041 | /* dig1pin case */ | ||
5042 | if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE) | ||
5043 | return 2; | ||
5044 | |||
5045 | /* dig0pin + dig2pin case */ | ||
5046 | if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE) | ||
5047 | return 2; | ||
5048 | if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE) | ||
5049 | return 1; | ||
5050 | else | ||
5051 | return 0; | ||
5052 | } | ||
5053 | |||
4745 | static int patch_stac92hd71bxx(struct hda_codec *codec) | 5054 | static int patch_stac92hd71bxx(struct hda_codec *codec) |
4746 | { | 5055 | { |
4747 | struct sigmatel_spec *spec; | 5056 | struct sigmatel_spec *spec; |
5057 | struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init; | ||
4748 | int err = 0; | 5058 | int err = 0; |
5059 | unsigned int ndmic_nids = 0; | ||
4749 | 5060 | ||
4750 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 5061 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
4751 | if (spec == NULL) | 5062 | if (spec == NULL) |
@@ -4753,27 +5064,32 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) | |||
4753 | 5064 | ||
4754 | codec->spec = spec; | 5065 | codec->spec = spec; |
4755 | codec->patch_ops = stac92xx_patch_ops; | 5066 | codec->patch_ops = stac92xx_patch_ops; |
4756 | spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids); | 5067 | spec->num_pins = STAC92HD71BXX_NUM_PINS; |
5068 | switch (codec->vendor_id) { | ||
5069 | case 0x111d76b6: | ||
5070 | case 0x111d76b7: | ||
5071 | spec->pin_nids = stac92hd71bxx_pin_nids_4port; | ||
5072 | break; | ||
5073 | case 0x111d7603: | ||
5074 | case 0x111d7608: | ||
5075 | /* On 92HD75Bx 0x27 isn't a pin nid */ | ||
5076 | spec->num_pins--; | ||
5077 | /* fallthrough */ | ||
5078 | default: | ||
5079 | spec->pin_nids = stac92hd71bxx_pin_nids_6port; | ||
5080 | } | ||
4757 | spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids); | 5081 | spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids); |
4758 | spec->pin_nids = stac92hd71bxx_pin_nids; | ||
4759 | memcpy(&spec->private_dimux, &stac92hd71bxx_dmux, | ||
4760 | sizeof(stac92hd71bxx_dmux)); | ||
4761 | spec->board_config = snd_hda_check_board_config(codec, | 5082 | spec->board_config = snd_hda_check_board_config(codec, |
4762 | STAC_92HD71BXX_MODELS, | 5083 | STAC_92HD71BXX_MODELS, |
4763 | stac92hd71bxx_models, | 5084 | stac92hd71bxx_models, |
4764 | stac92hd71bxx_cfg_tbl); | 5085 | stac92hd71bxx_cfg_tbl); |
4765 | again: | 5086 | again: |
4766 | if (spec->board_config < 0) { | 5087 | if (spec->board_config < 0) |
4767 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" | 5088 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" |
4768 | " STAC92HD71BXX, using BIOS defaults\n"); | 5089 | " STAC92HD71BXX, using BIOS defaults\n"); |
4769 | err = stac92xx_save_bios_config_regs(codec); | 5090 | else |
4770 | } else | 5091 | stac92xx_set_config_regs(codec, |
4771 | err = stac_save_pin_cfgs(codec, | ||
4772 | stac92hd71bxx_brd_tbl[spec->board_config]); | 5092 | stac92hd71bxx_brd_tbl[spec->board_config]); |
4773 | if (err < 0) { | ||
4774 | stac92xx_free(codec); | ||
4775 | return err; | ||
4776 | } | ||
4777 | 5093 | ||
4778 | if (spec->board_config > STAC_92HD71BXX_REF) { | 5094 | if (spec->board_config > STAC_92HD71BXX_REF) { |
4779 | /* GPIO0 = EAPD */ | 5095 | /* GPIO0 = EAPD */ |
@@ -4782,16 +5098,34 @@ again: | |||
4782 | spec->gpio_data = 0x01; | 5098 | spec->gpio_data = 0x01; |
4783 | } | 5099 | } |
4784 | 5100 | ||
5101 | spec->dmic_nids = stac92hd71bxx_dmic_nids; | ||
5102 | spec->dmux_nids = stac92hd71bxx_dmux_nids; | ||
5103 | |||
4785 | switch (codec->vendor_id) { | 5104 | switch (codec->vendor_id) { |
4786 | case 0x111d76b6: /* 4 Port without Analog Mixer */ | 5105 | case 0x111d76b6: /* 4 Port without Analog Mixer */ |
4787 | case 0x111d76b7: | 5106 | case 0x111d76b7: |
5107 | unmute_init++; | ||
5108 | /* fallthru */ | ||
4788 | case 0x111d76b4: /* 6 Port without Analog Mixer */ | 5109 | case 0x111d76b4: /* 6 Port without Analog Mixer */ |
4789 | case 0x111d76b5: | 5110 | case 0x111d76b5: |
5111 | memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_nomixer, | ||
5112 | sizeof(stac92hd71bxx_dmux_nomixer)); | ||
4790 | spec->mixer = stac92hd71bxx_mixer; | 5113 | spec->mixer = stac92hd71bxx_mixer; |
4791 | spec->init = stac92hd71bxx_core_init; | 5114 | spec->init = stac92hd71bxx_core_init; |
4792 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; | 5115 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; |
5116 | spec->num_dmics = stac92hd71bxx_connected_ports(codec, | ||
5117 | stac92hd71bxx_dmic_nids, | ||
5118 | STAC92HD71BXX_NUM_DMICS); | ||
5119 | if (spec->num_dmics) { | ||
5120 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | ||
5121 | spec->dinput_mux = &spec->private_dimux; | ||
5122 | ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1; | ||
5123 | } | ||
4793 | break; | 5124 | break; |
4794 | case 0x111d7608: /* 5 Port with Analog Mixer */ | 5125 | case 0x111d7608: /* 5 Port with Analog Mixer */ |
5126 | memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer, | ||
5127 | sizeof(stac92hd71bxx_dmux_amixer)); | ||
5128 | spec->private_dimux.num_items--; | ||
4795 | switch (spec->board_config) { | 5129 | switch (spec->board_config) { |
4796 | case STAC_HP_M4: | 5130 | case STAC_HP_M4: |
4797 | /* Enable VREF power saving on GPIO1 detect */ | 5131 | /* Enable VREF power saving on GPIO1 detect */ |
@@ -4818,7 +5152,15 @@ again: | |||
4818 | 5152 | ||
4819 | /* disable VSW */ | 5153 | /* disable VSW */ |
4820 | spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF]; | 5154 | spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF]; |
4821 | stac_change_pin_config(codec, 0xf, 0x40f000f0); | 5155 | unmute_init++; |
5156 | snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0); | ||
5157 | snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); | ||
5158 | stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS - 1] = 0; | ||
5159 | spec->num_dmics = stac92hd71bxx_connected_ports(codec, | ||
5160 | stac92hd71bxx_dmic_nids, | ||
5161 | STAC92HD71BXX_NUM_DMICS - 1); | ||
5162 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | ||
5163 | ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 2; | ||
4822 | break; | 5164 | break; |
4823 | case 0x111d7603: /* 6 Port with Analog Mixer */ | 5165 | case 0x111d7603: /* 6 Port with Analog Mixer */ |
4824 | if ((codec->revision_id & 0xf) == 1) | 5166 | if ((codec->revision_id & 0xf) == 1) |
@@ -4828,12 +5170,23 @@ again: | |||
4828 | spec->num_pwrs = 0; | 5170 | spec->num_pwrs = 0; |
4829 | /* fallthru */ | 5171 | /* fallthru */ |
4830 | default: | 5172 | default: |
5173 | memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer, | ||
5174 | sizeof(stac92hd71bxx_dmux_amixer)); | ||
4831 | spec->dinput_mux = &spec->private_dimux; | 5175 | spec->dinput_mux = &spec->private_dimux; |
4832 | spec->mixer = stac92hd71bxx_analog_mixer; | 5176 | spec->mixer = stac92hd71bxx_analog_mixer; |
4833 | spec->init = stac92hd71bxx_analog_core_init; | 5177 | spec->init = stac92hd71bxx_analog_core_init; |
4834 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; | 5178 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; |
5179 | spec->num_dmics = stac92hd71bxx_connected_ports(codec, | ||
5180 | stac92hd71bxx_dmic_nids, | ||
5181 | STAC92HD71BXX_NUM_DMICS); | ||
5182 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | ||
5183 | ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1; | ||
4835 | } | 5184 | } |
4836 | 5185 | ||
5186 | if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) | ||
5187 | snd_hda_sequence_write_cache(codec, unmute_init); | ||
5188 | |||
5189 | spec->aloopback_ctl = stac92hd71bxx_loopback; | ||
4837 | spec->aloopback_mask = 0x50; | 5190 | spec->aloopback_mask = 0x50; |
4838 | spec->aloopback_shift = 0; | 5191 | spec->aloopback_shift = 0; |
4839 | 5192 | ||
@@ -4841,18 +5194,17 @@ again: | |||
4841 | spec->digbeep_nid = 0x26; | 5194 | spec->digbeep_nid = 0x26; |
4842 | spec->mux_nids = stac92hd71bxx_mux_nids; | 5195 | spec->mux_nids = stac92hd71bxx_mux_nids; |
4843 | spec->adc_nids = stac92hd71bxx_adc_nids; | 5196 | spec->adc_nids = stac92hd71bxx_adc_nids; |
4844 | spec->dmic_nids = stac92hd71bxx_dmic_nids; | ||
4845 | spec->dmux_nids = stac92hd71bxx_dmux_nids; | ||
4846 | spec->smux_nids = stac92hd71bxx_smux_nids; | 5197 | spec->smux_nids = stac92hd71bxx_smux_nids; |
4847 | spec->pwr_nids = stac92hd71bxx_pwr_nids; | 5198 | spec->pwr_nids = stac92hd71bxx_pwr_nids; |
4848 | 5199 | ||
4849 | spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids); | 5200 | spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids); |
4850 | spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids); | 5201 | spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids); |
5202 | spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e); | ||
4851 | 5203 | ||
4852 | switch (spec->board_config) { | 5204 | switch (spec->board_config) { |
4853 | case STAC_HP_M4: | 5205 | case STAC_HP_M4: |
4854 | /* enable internal microphone */ | 5206 | /* enable internal microphone */ |
4855 | stac_change_pin_config(codec, 0x0e, 0x01813040); | 5207 | snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040); |
4856 | stac92xx_auto_set_pinctl(codec, 0x0e, | 5208 | stac92xx_auto_set_pinctl(codec, 0x0e, |
4857 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); | 5209 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); |
4858 | /* fallthru */ | 5210 | /* fallthru */ |
@@ -4865,21 +5217,38 @@ again: | |||
4865 | case STAC_DELL_M4_3: | 5217 | case STAC_DELL_M4_3: |
4866 | spec->num_dmics = 1; | 5218 | spec->num_dmics = 1; |
4867 | spec->num_smuxes = 0; | 5219 | spec->num_smuxes = 0; |
4868 | spec->num_dmuxes = 0; | 5220 | spec->num_dmuxes = 1; |
5221 | break; | ||
5222 | case STAC_HP_DV5: | ||
5223 | snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); | ||
5224 | stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN); | ||
5225 | break; | ||
5226 | case STAC_HP_HDX: | ||
5227 | spec->num_dmics = 1; | ||
5228 | spec->num_dmuxes = 1; | ||
5229 | spec->num_smuxes = 1; | ||
5230 | /* | ||
5231 | * For controlling MUTE LED on HP HDX16/HDX18 notebooks, | ||
5232 | * the CONFIG_SND_HDA_POWER_SAVE is needed to be set. | ||
5233 | */ | ||
5234 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
5235 | /* orange/white mute led on GPIO3, orange=0, white=1 */ | ||
5236 | spec->gpio_mask |= 0x08; | ||
5237 | spec->gpio_dir |= 0x08; | ||
5238 | spec->gpio_data |= 0x08; /* set to white */ | ||
5239 | |||
5240 | /* register check_power_status callback. */ | ||
5241 | codec->patch_ops.check_power_status = | ||
5242 | stac92xx_hp_hdx_check_power_status; | ||
5243 | #endif | ||
4869 | break; | 5244 | break; |
4870 | default: | ||
4871 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; | ||
4872 | spec->num_smuxes = ARRAY_SIZE(stac92hd71bxx_smux_nids); | ||
4873 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | ||
4874 | }; | 5245 | }; |
4875 | 5246 | ||
4876 | spec->multiout.dac_nids = spec->dac_nids; | 5247 | spec->multiout.dac_nids = spec->dac_nids; |
4877 | if (spec->dinput_mux) | 5248 | if (spec->dinput_mux) |
4878 | spec->private_dimux.num_items += | 5249 | spec->private_dimux.num_items += spec->num_dmics - ndmic_nids; |
4879 | spec->num_dmics - | ||
4880 | (ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1); | ||
4881 | 5250 | ||
4882 | err = stac92xx_parse_auto_config(codec, 0x21, 0x23); | 5251 | err = stac92xx_parse_auto_config(codec, 0x21, 0); |
4883 | if (!err) { | 5252 | if (!err) { |
4884 | if (spec->board_config < 0) { | 5253 | if (spec->board_config < 0) { |
4885 | printk(KERN_WARNING "hda_codec: No auto-config is " | 5254 | printk(KERN_WARNING "hda_codec: No auto-config is " |
@@ -4954,17 +5323,12 @@ static int patch_stac922x(struct hda_codec *codec) | |||
4954 | } | 5323 | } |
4955 | 5324 | ||
4956 | again: | 5325 | again: |
4957 | if (spec->board_config < 0) { | 5326 | if (spec->board_config < 0) |
4958 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, " | 5327 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, " |
4959 | "using BIOS defaults\n"); | 5328 | "using BIOS defaults\n"); |
4960 | err = stac92xx_save_bios_config_regs(codec); | 5329 | else |
4961 | } else | 5330 | stac92xx_set_config_regs(codec, |
4962 | err = stac_save_pin_cfgs(codec, | ||
4963 | stac922x_brd_tbl[spec->board_config]); | 5331 | stac922x_brd_tbl[spec->board_config]); |
4964 | if (err < 0) { | ||
4965 | stac92xx_free(codec); | ||
4966 | return err; | ||
4967 | } | ||
4968 | 5332 | ||
4969 | spec->adc_nids = stac922x_adc_nids; | 5333 | spec->adc_nids = stac922x_adc_nids; |
4970 | spec->mux_nids = stac922x_mux_nids; | 5334 | spec->mux_nids = stac922x_mux_nids; |
@@ -5015,24 +5379,19 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5015 | return -ENOMEM; | 5379 | return -ENOMEM; |
5016 | 5380 | ||
5017 | codec->spec = spec; | 5381 | codec->spec = spec; |
5382 | codec->slave_dig_outs = stac927x_slave_dig_outs; | ||
5018 | spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); | 5383 | spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); |
5019 | spec->pin_nids = stac927x_pin_nids; | 5384 | spec->pin_nids = stac927x_pin_nids; |
5020 | spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS, | 5385 | spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS, |
5021 | stac927x_models, | 5386 | stac927x_models, |
5022 | stac927x_cfg_tbl); | 5387 | stac927x_cfg_tbl); |
5023 | again: | 5388 | again: |
5024 | if (spec->board_config < 0 || !stac927x_brd_tbl[spec->board_config]) { | 5389 | if (spec->board_config < 0) |
5025 | if (spec->board_config < 0) | 5390 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" |
5026 | snd_printdd(KERN_INFO "hda_codec: Unknown model for" | 5391 | "STAC927x, using BIOS defaults\n"); |
5027 | "STAC927x, using BIOS defaults\n"); | 5392 | else |
5028 | err = stac92xx_save_bios_config_regs(codec); | 5393 | stac92xx_set_config_regs(codec, |
5029 | } else | ||
5030 | err = stac_save_pin_cfgs(codec, | ||
5031 | stac927x_brd_tbl[spec->board_config]); | 5394 | stac927x_brd_tbl[spec->board_config]); |
5032 | if (err < 0) { | ||
5033 | stac92xx_free(codec); | ||
5034 | return err; | ||
5035 | } | ||
5036 | 5395 | ||
5037 | spec->digbeep_nid = 0x23; | 5396 | spec->digbeep_nid = 0x23; |
5038 | spec->adc_nids = stac927x_adc_nids; | 5397 | spec->adc_nids = stac927x_adc_nids; |
@@ -5061,15 +5420,15 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5061 | case 0x10280209: | 5420 | case 0x10280209: |
5062 | case 0x1028022e: | 5421 | case 0x1028022e: |
5063 | /* correct the device field to SPDIF out */ | 5422 | /* correct the device field to SPDIF out */ |
5064 | stac_change_pin_config(codec, 0x21, 0x01442070); | 5423 | snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070); |
5065 | break; | 5424 | break; |
5066 | }; | 5425 | }; |
5067 | /* configure the analog microphone on some laptops */ | 5426 | /* configure the analog microphone on some laptops */ |
5068 | stac_change_pin_config(codec, 0x0c, 0x90a79130); | 5427 | snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130); |
5069 | /* correct the front output jack as a hp out */ | 5428 | /* correct the front output jack as a hp out */ |
5070 | stac_change_pin_config(codec, 0x0f, 0x0227011f); | 5429 | snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f); |
5071 | /* correct the front input jack as a mic */ | 5430 | /* correct the front input jack as a mic */ |
5072 | stac_change_pin_config(codec, 0x0e, 0x02a79130); | 5431 | snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130); |
5073 | /* fallthru */ | 5432 | /* fallthru */ |
5074 | case STAC_DELL_3ST: | 5433 | case STAC_DELL_3ST: |
5075 | /* GPIO2 High = Enable EAPD */ | 5434 | /* GPIO2 High = Enable EAPD */ |
@@ -5096,6 +5455,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5096 | } | 5455 | } |
5097 | 5456 | ||
5098 | spec->num_pwrs = 0; | 5457 | spec->num_pwrs = 0; |
5458 | spec->aloopback_ctl = stac927x_loopback; | ||
5099 | spec->aloopback_mask = 0x40; | 5459 | spec->aloopback_mask = 0x40; |
5100 | spec->aloopback_shift = 0; | 5460 | spec->aloopback_shift = 0; |
5101 | spec->eapd_switch = 1; | 5461 | spec->eapd_switch = 1; |
@@ -5154,16 +5514,11 @@ static int patch_stac9205(struct hda_codec *codec) | |||
5154 | stac9205_models, | 5514 | stac9205_models, |
5155 | stac9205_cfg_tbl); | 5515 | stac9205_cfg_tbl); |
5156 | again: | 5516 | again: |
5157 | if (spec->board_config < 0) { | 5517 | if (spec->board_config < 0) |
5158 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n"); | 5518 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n"); |
5159 | err = stac92xx_save_bios_config_regs(codec); | 5519 | else |
5160 | } else | 5520 | stac92xx_set_config_regs(codec, |
5161 | err = stac_save_pin_cfgs(codec, | ||
5162 | stac9205_brd_tbl[spec->board_config]); | 5521 | stac9205_brd_tbl[spec->board_config]); |
5163 | if (err < 0) { | ||
5164 | stac92xx_free(codec); | ||
5165 | return err; | ||
5166 | } | ||
5167 | 5522 | ||
5168 | spec->digbeep_nid = 0x23; | 5523 | spec->digbeep_nid = 0x23; |
5169 | spec->adc_nids = stac9205_adc_nids; | 5524 | spec->adc_nids = stac9205_adc_nids; |
@@ -5180,17 +5535,20 @@ static int patch_stac9205(struct hda_codec *codec) | |||
5180 | 5535 | ||
5181 | spec->init = stac9205_core_init; | 5536 | spec->init = stac9205_core_init; |
5182 | spec->mixer = stac9205_mixer; | 5537 | spec->mixer = stac9205_mixer; |
5538 | spec->aloopback_ctl = stac9205_loopback; | ||
5183 | 5539 | ||
5184 | spec->aloopback_mask = 0x40; | 5540 | spec->aloopback_mask = 0x40; |
5185 | spec->aloopback_shift = 0; | 5541 | spec->aloopback_shift = 0; |
5186 | spec->eapd_switch = 1; | 5542 | /* Turn on/off EAPD per HP plugging */ |
5543 | if (spec->board_config != STAC_9205_EAPD) | ||
5544 | spec->eapd_switch = 1; | ||
5187 | spec->multiout.dac_nids = spec->dac_nids; | 5545 | spec->multiout.dac_nids = spec->dac_nids; |
5188 | 5546 | ||
5189 | switch (spec->board_config){ | 5547 | switch (spec->board_config){ |
5190 | case STAC_9205_DELL_M43: | 5548 | case STAC_9205_DELL_M43: |
5191 | /* Enable SPDIF in/out */ | 5549 | /* Enable SPDIF in/out */ |
5192 | stac_change_pin_config(codec, 0x1f, 0x01441030); | 5550 | snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030); |
5193 | stac_change_pin_config(codec, 0x20, 0x1c410030); | 5551 | snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030); |
5194 | 5552 | ||
5195 | /* Enable unsol response for GPIO4/Dock HP connection */ | 5553 | /* Enable unsol response for GPIO4/Dock HP connection */ |
5196 | err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01); | 5554 | err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01); |
@@ -5247,223 +5605,87 @@ static int patch_stac9205(struct hda_codec *codec) | |||
5247 | * STAC9872 hack | 5605 | * STAC9872 hack |
5248 | */ | 5606 | */ |
5249 | 5607 | ||
5250 | /* static config for Sony VAIO FE550G and Sony VAIO AR */ | 5608 | static struct hda_verb stac9872_core_init[] = { |
5251 | static hda_nid_t vaio_dacs[] = { 0x2 }; | ||
5252 | #define VAIO_HP_DAC 0x5 | ||
5253 | static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ }; | ||
5254 | static hda_nid_t vaio_mux_nids[] = { 0x15 }; | ||
5255 | |||
5256 | static struct hda_input_mux vaio_mux = { | ||
5257 | .num_items = 3, | ||
5258 | .items = { | ||
5259 | /* { "HP", 0x0 }, */ | ||
5260 | { "Mic Jack", 0x1 }, | ||
5261 | { "Internal Mic", 0x2 }, | ||
5262 | { "PCM", 0x3 }, | ||
5263 | } | ||
5264 | }; | ||
5265 | |||
5266 | static struct hda_verb vaio_init[] = { | ||
5267 | {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */ | ||
5268 | {0x0a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | STAC_HP_EVENT}, | ||
5269 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */ | ||
5270 | {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */ | ||
5271 | {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */ | ||
5272 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */ | ||
5273 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */ | 5609 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */ |
5274 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */ | ||
5275 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */ | ||
5276 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */ | ||
5277 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */ | ||
5278 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ | 5610 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ |
5279 | {} | 5611 | {} |
5280 | }; | 5612 | }; |
5281 | 5613 | ||
5282 | static struct hda_verb vaio_ar_init[] = { | 5614 | static struct snd_kcontrol_new stac9872_mixer[] = { |
5283 | {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */ | ||
5284 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */ | ||
5285 | {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */ | ||
5286 | {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */ | ||
5287 | /* {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */ | ||
5288 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */ | ||
5289 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */ | ||
5290 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */ | ||
5291 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */ | ||
5292 | /* {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */ | ||
5293 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */ | ||
5294 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */ | ||
5295 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ | ||
5296 | {} | ||
5297 | }; | ||
5298 | |||
5299 | static struct snd_kcontrol_new vaio_mixer[] = { | ||
5300 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x02, 0, HDA_OUTPUT), | ||
5301 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x02, 0, HDA_OUTPUT), | ||
5302 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x05, 0, HDA_OUTPUT), | ||
5303 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x05, 0, HDA_OUTPUT), | ||
5304 | /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */ | ||
5305 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT), | 5615 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT), |
5306 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT), | 5616 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT), |
5307 | { | 5617 | { } /* end */ |
5308 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
5309 | .name = "Capture Source", | ||
5310 | .count = 1, | ||
5311 | .info = stac92xx_mux_enum_info, | ||
5312 | .get = stac92xx_mux_enum_get, | ||
5313 | .put = stac92xx_mux_enum_put, | ||
5314 | }, | ||
5315 | {} | ||
5316 | }; | 5618 | }; |
5317 | 5619 | ||
5318 | static struct snd_kcontrol_new vaio_ar_mixer[] = { | 5620 | static hda_nid_t stac9872_pin_nids[] = { |
5319 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x02, 0, HDA_OUTPUT), | 5621 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
5320 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x02, 0, HDA_OUTPUT), | 5622 | 0x11, 0x13, 0x14, |
5321 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x05, 0, HDA_OUTPUT), | ||
5322 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x05, 0, HDA_OUTPUT), | ||
5323 | /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */ | ||
5324 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT), | ||
5325 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT), | ||
5326 | /*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT), | ||
5327 | HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/ | ||
5328 | { | ||
5329 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
5330 | .name = "Capture Source", | ||
5331 | .count = 1, | ||
5332 | .info = stac92xx_mux_enum_info, | ||
5333 | .get = stac92xx_mux_enum_get, | ||
5334 | .put = stac92xx_mux_enum_put, | ||
5335 | }, | ||
5336 | {} | ||
5337 | }; | 5623 | }; |
5338 | 5624 | ||
5339 | static struct hda_codec_ops stac9872_patch_ops = { | 5625 | static hda_nid_t stac9872_adc_nids[] = { |
5340 | .build_controls = stac92xx_build_controls, | 5626 | 0x8 /*,0x6*/ |
5341 | .build_pcms = stac92xx_build_pcms, | ||
5342 | .init = stac92xx_init, | ||
5343 | .free = stac92xx_free, | ||
5344 | #ifdef SND_HDA_NEEDS_RESUME | ||
5345 | .resume = stac92xx_resume, | ||
5346 | #endif | ||
5347 | }; | 5627 | }; |
5348 | 5628 | ||
5349 | static int stac9872_vaio_init(struct hda_codec *codec) | 5629 | static hda_nid_t stac9872_mux_nids[] = { |
5350 | { | 5630 | 0x15 |
5351 | int err; | ||
5352 | |||
5353 | err = stac92xx_init(codec); | ||
5354 | if (err < 0) | ||
5355 | return err; | ||
5356 | if (codec->patch_ops.unsol_event) | ||
5357 | codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); | ||
5358 | return 0; | ||
5359 | } | ||
5360 | |||
5361 | static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res) | ||
5362 | { | ||
5363 | if (get_pin_presence(codec, 0x0a)) { | ||
5364 | stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN); | ||
5365 | stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN); | ||
5366 | } else { | ||
5367 | stac92xx_reset_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN); | ||
5368 | stac92xx_set_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN); | ||
5369 | } | ||
5370 | } | ||
5371 | |||
5372 | static void stac9872_vaio_unsol_event(struct hda_codec *codec, unsigned int res) | ||
5373 | { | ||
5374 | switch (res >> 26) { | ||
5375 | case STAC_HP_EVENT: | ||
5376 | stac9872_vaio_hp_detect(codec, res); | ||
5377 | break; | ||
5378 | } | ||
5379 | } | ||
5380 | |||
5381 | static struct hda_codec_ops stac9872_vaio_patch_ops = { | ||
5382 | .build_controls = stac92xx_build_controls, | ||
5383 | .build_pcms = stac92xx_build_pcms, | ||
5384 | .init = stac9872_vaio_init, | ||
5385 | .free = stac92xx_free, | ||
5386 | .unsol_event = stac9872_vaio_unsol_event, | ||
5387 | #ifdef CONFIG_PM | ||
5388 | .resume = stac92xx_resume, | ||
5389 | #endif | ||
5390 | }; | 5631 | }; |
5391 | 5632 | ||
5392 | enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */ | 5633 | static unsigned int stac9872_vaio_pin_configs[9] = { |
5393 | CXD9872RD_VAIO, | 5634 | 0x03211020, 0x411111f0, 0x411111f0, 0x03a15030, |
5394 | /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */ | 5635 | 0x411111f0, 0x90170110, 0x411111f0, 0x411111f0, |
5395 | STAC9872AK_VAIO, | 5636 | 0x90a7013e |
5396 | /* Unknown. id=0x83847661 and subsys=0x104D1200. */ | ||
5397 | STAC9872K_VAIO, | ||
5398 | /* AR Series. id=0x83847664 and subsys=104D1300 */ | ||
5399 | CXD9872AKD_VAIO, | ||
5400 | STAC_9872_MODELS, | ||
5401 | }; | 5637 | }; |
5402 | 5638 | ||
5403 | static const char *stac9872_models[STAC_9872_MODELS] = { | 5639 | static const char *stac9872_models[STAC_9872_MODELS] = { |
5404 | [CXD9872RD_VAIO] = "vaio", | 5640 | [STAC_9872_AUTO] = "auto", |
5405 | [CXD9872AKD_VAIO] = "vaio-ar", | 5641 | [STAC_9872_VAIO] = "vaio", |
5642 | }; | ||
5643 | |||
5644 | static unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = { | ||
5645 | [STAC_9872_VAIO] = stac9872_vaio_pin_configs, | ||
5406 | }; | 5646 | }; |
5407 | 5647 | ||
5408 | static struct snd_pci_quirk stac9872_cfg_tbl[] = { | 5648 | static struct snd_pci_quirk stac9872_cfg_tbl[] = { |
5409 | SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO), | 5649 | {} /* terminator */ |
5410 | SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO), | ||
5411 | SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO), | ||
5412 | SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO), | ||
5413 | {} | ||
5414 | }; | 5650 | }; |
5415 | 5651 | ||
5416 | static int patch_stac9872(struct hda_codec *codec) | 5652 | static int patch_stac9872(struct hda_codec *codec) |
5417 | { | 5653 | { |
5418 | struct sigmatel_spec *spec; | 5654 | struct sigmatel_spec *spec; |
5419 | int board_config; | 5655 | int err; |
5420 | 5656 | ||
5421 | board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS, | ||
5422 | stac9872_models, | ||
5423 | stac9872_cfg_tbl); | ||
5424 | if (board_config < 0) | ||
5425 | /* unknown config, let generic-parser do its job... */ | ||
5426 | return snd_hda_parse_generic_codec(codec); | ||
5427 | |||
5428 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 5657 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
5429 | if (spec == NULL) | 5658 | if (spec == NULL) |
5430 | return -ENOMEM; | 5659 | return -ENOMEM; |
5431 | |||
5432 | codec->spec = spec; | 5660 | codec->spec = spec; |
5433 | switch (board_config) { | ||
5434 | case CXD9872RD_VAIO: | ||
5435 | case STAC9872AK_VAIO: | ||
5436 | case STAC9872K_VAIO: | ||
5437 | spec->mixer = vaio_mixer; | ||
5438 | spec->init = vaio_init; | ||
5439 | spec->multiout.max_channels = 2; | ||
5440 | spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs); | ||
5441 | spec->multiout.dac_nids = vaio_dacs; | ||
5442 | spec->multiout.hp_nid = VAIO_HP_DAC; | ||
5443 | spec->num_adcs = ARRAY_SIZE(vaio_adcs); | ||
5444 | spec->adc_nids = vaio_adcs; | ||
5445 | spec->num_pwrs = 0; | ||
5446 | spec->input_mux = &vaio_mux; | ||
5447 | spec->mux_nids = vaio_mux_nids; | ||
5448 | codec->patch_ops = stac9872_vaio_patch_ops; | ||
5449 | break; | ||
5450 | |||
5451 | case CXD9872AKD_VAIO: | ||
5452 | spec->mixer = vaio_ar_mixer; | ||
5453 | spec->init = vaio_ar_init; | ||
5454 | spec->multiout.max_channels = 2; | ||
5455 | spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs); | ||
5456 | spec->multiout.dac_nids = vaio_dacs; | ||
5457 | spec->multiout.hp_nid = VAIO_HP_DAC; | ||
5458 | spec->num_adcs = ARRAY_SIZE(vaio_adcs); | ||
5459 | spec->num_pwrs = 0; | ||
5460 | spec->adc_nids = vaio_adcs; | ||
5461 | spec->input_mux = &vaio_mux; | ||
5462 | spec->mux_nids = vaio_mux_nids; | ||
5463 | codec->patch_ops = stac9872_patch_ops; | ||
5464 | break; | ||
5465 | } | ||
5466 | 5661 | ||
5662 | spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS, | ||
5663 | stac9872_models, | ||
5664 | stac9872_cfg_tbl); | ||
5665 | if (spec->board_config < 0) | ||
5666 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9872, " | ||
5667 | "using BIOS defaults\n"); | ||
5668 | else | ||
5669 | stac92xx_set_config_regs(codec, | ||
5670 | stac9872_brd_tbl[spec->board_config]); | ||
5671 | |||
5672 | spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); | ||
5673 | spec->pin_nids = stac9872_pin_nids; | ||
5674 | spec->multiout.dac_nids = spec->dac_nids; | ||
5675 | spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids); | ||
5676 | spec->adc_nids = stac9872_adc_nids; | ||
5677 | spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids); | ||
5678 | spec->mux_nids = stac9872_mux_nids; | ||
5679 | spec->mixer = stac9872_mixer; | ||
5680 | spec->init = stac9872_core_init; | ||
5681 | |||
5682 | err = stac92xx_parse_auto_config(codec, 0x10, 0x12); | ||
5683 | if (err < 0) { | ||
5684 | stac92xx_free(codec); | ||
5685 | return -EINVAL; | ||
5686 | } | ||
5687 | spec->input_mux = &spec->private_imux; | ||
5688 | codec->patch_ops = stac92xx_patch_ops; | ||
5467 | return 0; | 5689 | return 0; |
5468 | } | 5690 | } |
5469 | 5691 | ||
@@ -5521,6 +5743,7 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
5521 | { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx}, | 5743 | { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx}, |
5522 | { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx}, | 5744 | { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx}, |
5523 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, | 5745 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, |
5746 | { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, | ||
5524 | { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx}, | 5747 | { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx}, |
5525 | { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx }, | 5748 | { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx }, |
5526 | { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx }, | 5749 | { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx }, |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index c761394cbe84..b25a5cc637d6 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -1308,16 +1308,13 @@ static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid) | |||
1308 | unsigned int def_conf; | 1308 | unsigned int def_conf; |
1309 | unsigned char seqassoc; | 1309 | unsigned char seqassoc; |
1310 | 1310 | ||
1311 | def_conf = snd_hda_codec_read(codec, nid, 0, | 1311 | def_conf = snd_hda_codec_get_pincfg(codec, nid); |
1312 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
1313 | seqassoc = (unsigned char) get_defcfg_association(def_conf); | 1312 | seqassoc = (unsigned char) get_defcfg_association(def_conf); |
1314 | seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf); | 1313 | seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf); |
1315 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) { | 1314 | if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) { |
1316 | if (seqassoc == 0xff) { | 1315 | if (seqassoc == 0xff) { |
1317 | def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30)); | 1316 | def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30)); |
1318 | snd_hda_codec_write(codec, nid, 0, | 1317 | snd_hda_codec_set_pincfg(codec, nid, def_conf); |
1319 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, | ||
1320 | def_conf >> 24); | ||
1321 | } | 1318 | } |
1322 | } | 1319 | } |
1323 | 1320 | ||
@@ -1354,7 +1351,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec) | |||
1354 | 1351 | ||
1355 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 1352 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
1356 | 1353 | ||
1357 | if (spec->autocfg.dig_out_pin) | 1354 | if (spec->autocfg.dig_outs) |
1358 | spec->multiout.dig_out_nid = VT1708_DIGOUT_NID; | 1355 | spec->multiout.dig_out_nid = VT1708_DIGOUT_NID; |
1359 | if (spec->autocfg.dig_in_pin) | 1356 | if (spec->autocfg.dig_in_pin) |
1360 | spec->dig_in_nid = VT1708_DIGIN_NID; | 1357 | spec->dig_in_nid = VT1708_DIGIN_NID; |
@@ -1827,7 +1824,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec) | |||
1827 | 1824 | ||
1828 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 1825 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
1829 | 1826 | ||
1830 | if (spec->autocfg.dig_out_pin) | 1827 | if (spec->autocfg.dig_outs) |
1831 | spec->multiout.dig_out_nid = VT1709_DIGOUT_NID; | 1828 | spec->multiout.dig_out_nid = VT1709_DIGOUT_NID; |
1832 | if (spec->autocfg.dig_in_pin) | 1829 | if (spec->autocfg.dig_in_pin) |
1833 | spec->dig_in_nid = VT1709_DIGIN_NID; | 1830 | spec->dig_in_nid = VT1709_DIGIN_NID; |
@@ -2371,7 +2368,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec) | |||
2371 | 2368 | ||
2372 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 2369 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
2373 | 2370 | ||
2374 | if (spec->autocfg.dig_out_pin) | 2371 | if (spec->autocfg.dig_outs) |
2375 | spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID; | 2372 | spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID; |
2376 | if (spec->autocfg.dig_in_pin) | 2373 | if (spec->autocfg.dig_in_pin) |
2377 | spec->dig_in_nid = VT1708B_DIGIN_NID; | 2374 | spec->dig_in_nid = VT1708B_DIGIN_NID; |
@@ -2836,7 +2833,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec) | |||
2836 | 2833 | ||
2837 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 2834 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
2838 | 2835 | ||
2839 | if (spec->autocfg.dig_out_pin) | 2836 | if (spec->autocfg.dig_outs) |
2840 | spec->multiout.dig_out_nid = VT1708S_DIGOUT_NID; | 2837 | spec->multiout.dig_out_nid = VT1708S_DIGOUT_NID; |
2841 | 2838 | ||
2842 | spec->extra_dig_out_nid = 0x15; | 2839 | spec->extra_dig_out_nid = 0x15; |
@@ -3155,7 +3152,7 @@ static int vt1702_parse_auto_config(struct hda_codec *codec) | |||
3155 | 3152 | ||
3156 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 3153 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
3157 | 3154 | ||
3158 | if (spec->autocfg.dig_out_pin) | 3155 | if (spec->autocfg.dig_outs) |
3159 | spec->multiout.dig_out_nid = VT1702_DIGOUT_NID; | 3156 | spec->multiout.dig_out_nid = VT1702_DIGOUT_NID; |
3160 | 3157 | ||
3161 | spec->extra_dig_out_nid = 0x1B; | 3158 | spec->extra_dig_out_nid = 0x1B; |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index bab1c700f497..0d0cdbdb4486 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
@@ -458,7 +458,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id) | |||
458 | u16 pbkstatus; | 458 | u16 pbkstatus; |
459 | struct snd_pcm_substream *substream; | 459 | struct snd_pcm_substream *substream; |
460 | pbkstatus = inw(ICEDS(ice, INTSTAT)); | 460 | pbkstatus = inw(ICEDS(ice, INTSTAT)); |
461 | /* printk("pbkstatus = 0x%x\n", pbkstatus); */ | 461 | /* printk(KERN_DEBUG "pbkstatus = 0x%x\n", pbkstatus); */ |
462 | for (idx = 0; idx < 6; idx++) { | 462 | for (idx = 0; idx < 6; idx++) { |
463 | if ((pbkstatus & (3 << (idx * 2))) == 0) | 463 | if ((pbkstatus & (3 << (idx * 2))) == 0) |
464 | continue; | 464 | continue; |
@@ -2533,8 +2533,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card, | |||
2533 | if (err < 0) | 2533 | if (err < 0) |
2534 | return err; | 2534 | return err; |
2535 | /* check, if we can restrict PCI DMA transfers to 28 bits */ | 2535 | /* check, if we can restrict PCI DMA transfers to 28 bits */ |
2536 | if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | 2536 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 || |
2537 | pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | 2537 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { |
2538 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); | 2538 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); |
2539 | pci_disable_device(pci); | 2539 | pci_disable_device(pci); |
2540 | return -ENXIO; | 2540 | return -ENXIO; |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 7ff36d3f0f44..128510e77a78 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
@@ -241,6 +241,8 @@ get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream) | |||
241 | struct snd_rawmidi_substream, list); | 241 | struct snd_rawmidi_substream, list); |
242 | } | 242 | } |
243 | 243 | ||
244 | static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable); | ||
245 | |||
244 | static void vt1724_midi_write(struct snd_ice1712 *ice) | 246 | static void vt1724_midi_write(struct snd_ice1712 *ice) |
245 | { | 247 | { |
246 | struct snd_rawmidi_substream *s; | 248 | struct snd_rawmidi_substream *s; |
@@ -254,6 +256,11 @@ static void vt1724_midi_write(struct snd_ice1712 *ice) | |||
254 | for (i = 0; i < count; ++i) | 256 | for (i = 0; i < count; ++i) |
255 | outb(buffer[i], ICEREG1724(ice, MPU_DATA)); | 257 | outb(buffer[i], ICEREG1724(ice, MPU_DATA)); |
256 | } | 258 | } |
259 | /* mask irq when all bytes have been transmitted. | ||
260 | * enabled again in output_trigger when the new data comes in. | ||
261 | */ | ||
262 | enable_midi_irq(ice, VT1724_IRQ_MPU_TX, | ||
263 | !snd_rawmidi_transmit_empty(s)); | ||
257 | } | 264 | } |
258 | 265 | ||
259 | static void vt1724_midi_read(struct snd_ice1712 *ice) | 266 | static void vt1724_midi_read(struct snd_ice1712 *ice) |
@@ -272,31 +279,34 @@ static void vt1724_midi_read(struct snd_ice1712 *ice) | |||
272 | } | 279 | } |
273 | } | 280 | } |
274 | 281 | ||
275 | static void vt1724_enable_midi_irq(struct snd_rawmidi_substream *substream, | 282 | /* call with ice->reg_lock */ |
276 | u8 flag, int enable) | 283 | static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable) |
277 | { | 284 | { |
278 | struct snd_ice1712 *ice = substream->rmidi->private_data; | 285 | u8 mask = inb(ICEREG1724(ice, IRQMASK)); |
279 | u8 mask; | ||
280 | |||
281 | spin_lock_irq(&ice->reg_lock); | ||
282 | mask = inb(ICEREG1724(ice, IRQMASK)); | ||
283 | if (enable) | 286 | if (enable) |
284 | mask &= ~flag; | 287 | mask &= ~flag; |
285 | else | 288 | else |
286 | mask |= flag; | 289 | mask |= flag; |
287 | outb(mask, ICEREG1724(ice, IRQMASK)); | 290 | outb(mask, ICEREG1724(ice, IRQMASK)); |
291 | } | ||
292 | |||
293 | static void vt1724_enable_midi_irq(struct snd_rawmidi_substream *substream, | ||
294 | u8 flag, int enable) | ||
295 | { | ||
296 | struct snd_ice1712 *ice = substream->rmidi->private_data; | ||
297 | |||
298 | spin_lock_irq(&ice->reg_lock); | ||
299 | enable_midi_irq(ice, flag, enable); | ||
288 | spin_unlock_irq(&ice->reg_lock); | 300 | spin_unlock_irq(&ice->reg_lock); |
289 | } | 301 | } |
290 | 302 | ||
291 | static int vt1724_midi_output_open(struct snd_rawmidi_substream *s) | 303 | static int vt1724_midi_output_open(struct snd_rawmidi_substream *s) |
292 | { | 304 | { |
293 | vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 1); | ||
294 | return 0; | 305 | return 0; |
295 | } | 306 | } |
296 | 307 | ||
297 | static int vt1724_midi_output_close(struct snd_rawmidi_substream *s) | 308 | static int vt1724_midi_output_close(struct snd_rawmidi_substream *s) |
298 | { | 309 | { |
299 | vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 0); | ||
300 | return 0; | 310 | return 0; |
301 | } | 311 | } |
302 | 312 | ||
@@ -311,6 +321,7 @@ static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up) | |||
311 | vt1724_midi_write(ice); | 321 | vt1724_midi_write(ice); |
312 | } else { | 322 | } else { |
313 | ice->midi_output = 0; | 323 | ice->midi_output = 0; |
324 | enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); | ||
314 | } | 325 | } |
315 | spin_unlock_irqrestore(&ice->reg_lock, flags); | 326 | spin_unlock_irqrestore(&ice->reg_lock, flags); |
316 | } | 327 | } |
@@ -320,6 +331,7 @@ static void vt1724_midi_output_drain(struct snd_rawmidi_substream *s) | |||
320 | struct snd_ice1712 *ice = s->rmidi->private_data; | 331 | struct snd_ice1712 *ice = s->rmidi->private_data; |
321 | unsigned long timeout; | 332 | unsigned long timeout; |
322 | 333 | ||
334 | vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 0); | ||
323 | /* 32 bytes should be transmitted in less than about 12 ms */ | 335 | /* 32 bytes should be transmitted in less than about 12 ms */ |
324 | timeout = jiffies + msecs_to_jiffies(15); | 336 | timeout = jiffies + msecs_to_jiffies(15); |
325 | do { | 337 | do { |
@@ -389,24 +401,24 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id) | |||
389 | status &= status_mask; | 401 | status &= status_mask; |
390 | if (status == 0) | 402 | if (status == 0) |
391 | break; | 403 | break; |
404 | spin_lock(&ice->reg_lock); | ||
392 | if (++timeout > 10) { | 405 | if (++timeout > 10) { |
393 | status = inb(ICEREG1724(ice, IRQSTAT)); | 406 | status = inb(ICEREG1724(ice, IRQSTAT)); |
394 | printk(KERN_ERR "ice1724: Too long irq loop, " | 407 | printk(KERN_ERR "ice1724: Too long irq loop, " |
395 | "status = 0x%x\n", status); | 408 | "status = 0x%x\n", status); |
396 | if (status & VT1724_IRQ_MPU_TX) { | 409 | if (status & VT1724_IRQ_MPU_TX) { |
397 | printk(KERN_ERR "ice1724: Disabling MPU_TX\n"); | 410 | printk(KERN_ERR "ice1724: Disabling MPU_TX\n"); |
398 | outb(inb(ICEREG1724(ice, IRQMASK)) | | 411 | enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); |
399 | VT1724_IRQ_MPU_TX, | ||
400 | ICEREG1724(ice, IRQMASK)); | ||
401 | } | 412 | } |
413 | spin_unlock(&ice->reg_lock); | ||
402 | break; | 414 | break; |
403 | } | 415 | } |
404 | handled = 1; | 416 | handled = 1; |
405 | if (status & VT1724_IRQ_MPU_TX) { | 417 | if (status & VT1724_IRQ_MPU_TX) { |
406 | spin_lock(&ice->reg_lock); | ||
407 | if (ice->midi_output) | 418 | if (ice->midi_output) |
408 | vt1724_midi_write(ice); | 419 | vt1724_midi_write(ice); |
409 | spin_unlock(&ice->reg_lock); | 420 | else |
421 | enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); | ||
410 | /* Due to mysterical reasons, MPU_TX is always | 422 | /* Due to mysterical reasons, MPU_TX is always |
411 | * generated (and can't be cleared) when a PCM | 423 | * generated (and can't be cleared) when a PCM |
412 | * playback is going. So let's ignore at the | 424 | * playback is going. So let's ignore at the |
@@ -415,15 +427,14 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id) | |||
415 | status_mask &= ~VT1724_IRQ_MPU_TX; | 427 | status_mask &= ~VT1724_IRQ_MPU_TX; |
416 | } | 428 | } |
417 | if (status & VT1724_IRQ_MPU_RX) { | 429 | if (status & VT1724_IRQ_MPU_RX) { |
418 | spin_lock(&ice->reg_lock); | ||
419 | if (ice->midi_input) | 430 | if (ice->midi_input) |
420 | vt1724_midi_read(ice); | 431 | vt1724_midi_read(ice); |
421 | else | 432 | else |
422 | vt1724_midi_clear_rx(ice); | 433 | vt1724_midi_clear_rx(ice); |
423 | spin_unlock(&ice->reg_lock); | ||
424 | } | 434 | } |
425 | /* ack MPU irq */ | 435 | /* ack MPU irq */ |
426 | outb(status, ICEREG1724(ice, IRQSTAT)); | 436 | outb(status, ICEREG1724(ice, IRQSTAT)); |
437 | spin_unlock(&ice->reg_lock); | ||
427 | if (status & VT1724_IRQ_MTPCM) { | 438 | if (status & VT1724_IRQ_MTPCM) { |
428 | /* | 439 | /* |
429 | * Multi-track PCM | 440 | * Multi-track PCM |
@@ -745,7 +756,14 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream) | |||
745 | 756 | ||
746 | spin_unlock_irq(&ice->reg_lock); | 757 | spin_unlock_irq(&ice->reg_lock); |
747 | 758 | ||
748 | /* printk("pro prepare: ch = %d, addr = 0x%x, buffer = 0x%x, period = 0x%x\n", substream->runtime->channels, (unsigned int)substream->runtime->dma_addr, snd_pcm_lib_buffer_bytes(substream), snd_pcm_lib_period_bytes(substream)); */ | 759 | /* |
760 | printk(KERN_DEBUG "pro prepare: ch = %d, addr = 0x%x, " | ||
761 | "buffer = 0x%x, period = 0x%x\n", | ||
762 | substream->runtime->channels, | ||
763 | (unsigned int)substream->runtime->dma_addr, | ||
764 | snd_pcm_lib_buffer_bytes(substream), | ||
765 | snd_pcm_lib_period_bytes(substream)); | ||
766 | */ | ||
749 | return 0; | 767 | return 0; |
750 | } | 768 | } |
751 | 769 | ||
@@ -2122,7 +2140,9 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, | |||
2122 | wait_i2c_busy(ice); | 2140 | wait_i2c_busy(ice); |
2123 | val = inb(ICEREG1724(ice, I2C_DATA)); | 2141 | val = inb(ICEREG1724(ice, I2C_DATA)); |
2124 | mutex_unlock(&ice->i2c_mutex); | 2142 | mutex_unlock(&ice->i2c_mutex); |
2125 | /* printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); */ | 2143 | /* |
2144 | printk(KERN_DEBUG "i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); | ||
2145 | */ | ||
2126 | return val; | 2146 | return val; |
2127 | } | 2147 | } |
2128 | 2148 | ||
@@ -2131,7 +2151,9 @@ void snd_vt1724_write_i2c(struct snd_ice1712 *ice, | |||
2131 | { | 2151 | { |
2132 | mutex_lock(&ice->i2c_mutex); | 2152 | mutex_lock(&ice->i2c_mutex); |
2133 | wait_i2c_busy(ice); | 2153 | wait_i2c_busy(ice); |
2134 | /* printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); */ | 2154 | /* |
2155 | printk(KERN_DEBUG "i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); | ||
2156 | */ | ||
2135 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); | 2157 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); |
2136 | outb(data, ICEREG1724(ice, I2C_DATA)); | 2158 | outb(data, ICEREG1724(ice, I2C_DATA)); |
2137 | outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); | 2159 | outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); |
diff --git a/sound/pci/ice1712/juli.c b/sound/pci/ice1712/juli.c index c51659b9caf6..fd948bfd9aef 100644 --- a/sound/pci/ice1712/juli.c +++ b/sound/pci/ice1712/juli.c | |||
@@ -345,8 +345,9 @@ static int juli_mute_put(struct snd_kcontrol *kcontrol, | |||
345 | new_gpio = old_gpio & | 345 | new_gpio = old_gpio & |
346 | ~((unsigned int) kcontrol->private_value); | 346 | ~((unsigned int) kcontrol->private_value); |
347 | } | 347 | } |
348 | /* printk("JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, \ | 348 | /* printk(KERN_DEBUG |
349 | new_gpio 0x%x\n", | 349 | "JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, " |
350 | "new_gpio 0x%x\n", | ||
350 | (unsigned int)ucontrol->value.integer.value[0], old_gpio, | 351 | (unsigned int)ucontrol->value.integer.value[0], old_gpio, |
351 | new_gpio); */ | 352 | new_gpio); */ |
352 | if (old_gpio != new_gpio) { | 353 | if (old_gpio != new_gpio) { |
diff --git a/sound/pci/ice1712/prodigy192.c b/sound/pci/ice1712/prodigy192.c index 48d3679292a7..2a8e5cd8f2d8 100644 --- a/sound/pci/ice1712/prodigy192.c +++ b/sound/pci/ice1712/prodigy192.c | |||
@@ -133,8 +133,10 @@ static int stac9460_dac_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
133 | idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + STAC946X_LF_VOLUME; | 133 | idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + STAC946X_LF_VOLUME; |
134 | /* due to possible conflicts with stac9460_set_rate_val, mutexing */ | 134 | /* due to possible conflicts with stac9460_set_rate_val, mutexing */ |
135 | mutex_lock(&spec->mute_mutex); | 135 | mutex_lock(&spec->mute_mutex); |
136 | /*printk("Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx, | 136 | /* |
137 | ucontrol->value.integer.value[0]);*/ | 137 | printk(KERN_DEBUG "Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx, |
138 | ucontrol->value.integer.value[0]); | ||
139 | */ | ||
138 | change = stac9460_dac_mute(ice, idx, ucontrol->value.integer.value[0]); | 140 | change = stac9460_dac_mute(ice, idx, ucontrol->value.integer.value[0]); |
139 | mutex_unlock(&spec->mute_mutex); | 141 | mutex_unlock(&spec->mute_mutex); |
140 | return change; | 142 | return change; |
@@ -185,7 +187,10 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
185 | change = (ovol != nvol); | 187 | change = (ovol != nvol); |
186 | if (change) { | 188 | if (change) { |
187 | ovol = (0x7f - nvol) | (tmp & 0x80); | 189 | ovol = (0x7f - nvol) | (tmp & 0x80); |
188 | /*printk("DAC Volume: reg 0x%02x: 0x%02x\n", idx, ovol);*/ | 190 | /* |
191 | printk(KERN_DEBUG "DAC Volume: reg 0x%02x: 0x%02x\n", | ||
192 | idx, ovol); | ||
193 | */ | ||
189 | stac9460_put(ice, idx, (0x7f - nvol) | (tmp & 0x80)); | 194 | stac9460_put(ice, idx, (0x7f - nvol) | (tmp & 0x80)); |
190 | } | 195 | } |
191 | return change; | 196 | return change; |
@@ -344,7 +349,7 @@ static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate) | |||
344 | for (idx = 0; idx < 7 ; ++idx) | 349 | for (idx = 0; idx < 7 ; ++idx) |
345 | changed[idx] = stac9460_dac_mute(ice, | 350 | changed[idx] = stac9460_dac_mute(ice, |
346 | STAC946X_MASTER_VOLUME + idx, 0); | 351 | STAC946X_MASTER_VOLUME + idx, 0); |
347 | /*printk("Rate change: %d, new MC: 0x%02x\n", rate, new);*/ | 352 | /*printk(KERN_DEBUG "Rate change: %d, new MC: 0x%02x\n", rate, new);*/ |
348 | stac9460_put(ice, STAC946X_MASTER_CLOCKING, new); | 353 | stac9460_put(ice, STAC946X_MASTER_CLOCKING, new); |
349 | udelay(10); | 354 | udelay(10); |
350 | /* unmuting - only originally unmuted dacs - | 355 | /* unmuting - only originally unmuted dacs - |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 671ff65db029..173bebf9f51d 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -355,6 +355,9 @@ struct ichdev { | |||
355 | unsigned int fragsize1; | 355 | unsigned int fragsize1; |
356 | unsigned int position; | 356 | unsigned int position; |
357 | unsigned int pos_shift; | 357 | unsigned int pos_shift; |
358 | unsigned int last_pos; | ||
359 | unsigned long last_pos_jiffies; | ||
360 | unsigned int jiffy_to_bytes; | ||
358 | int frags; | 361 | int frags; |
359 | int lvi; | 362 | int lvi; |
360 | int lvi_frag; | 363 | int lvi_frag; |
@@ -617,7 +620,7 @@ static int snd_intel8x0_ali_codec_semaphore(struct intel8x0 *chip) | |||
617 | int time = 100; | 620 | int time = 100; |
618 | if (chip->buggy_semaphore) | 621 | if (chip->buggy_semaphore) |
619 | return 0; /* just ignore ... */ | 622 | return 0; /* just ignore ... */ |
620 | while (time-- && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY)) | 623 | while (--time && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY)) |
621 | udelay(1); | 624 | udelay(1); |
622 | if (! time && ! chip->in_ac97_init) | 625 | if (! time && ! chip->in_ac97_init) |
623 | snd_printk(KERN_WARNING "ali_codec_semaphore timeout\n"); | 626 | snd_printk(KERN_WARNING "ali_codec_semaphore timeout\n"); |
@@ -689,7 +692,7 @@ static void snd_intel8x0_setup_periods(struct intel8x0 *chip, struct ichdev *ich | |||
689 | bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ | 692 | bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ |
690 | ichdev->fragsize >> ichdev->pos_shift); | 693 | ichdev->fragsize >> ichdev->pos_shift); |
691 | #if 0 | 694 | #if 0 |
692 | printk("bdbar[%i] = 0x%x [0x%x]\n", | 695 | printk(KERN_DEBUG "bdbar[%i] = 0x%x [0x%x]\n", |
693 | idx + 0, bdbar[idx + 0], bdbar[idx + 1]); | 696 | idx + 0, bdbar[idx + 0], bdbar[idx + 1]); |
694 | #endif | 697 | #endif |
695 | } | 698 | } |
@@ -701,8 +704,10 @@ static void snd_intel8x0_setup_periods(struct intel8x0 *chip, struct ichdev *ich | |||
701 | ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags; | 704 | ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags; |
702 | ichdev->position = 0; | 705 | ichdev->position = 0; |
703 | #if 0 | 706 | #if 0 |
704 | printk("lvi_frag = %i, frags = %i, period_size = 0x%x, period_size1 = 0x%x\n", | 707 | printk(KERN_DEBUG "lvi_frag = %i, frags = %i, period_size = 0x%x, " |
705 | ichdev->lvi_frag, ichdev->frags, ichdev->fragsize, ichdev->fragsize1); | 708 | "period_size1 = 0x%x\n", |
709 | ichdev->lvi_frag, ichdev->frags, ichdev->fragsize, | ||
710 | ichdev->fragsize1); | ||
706 | #endif | 711 | #endif |
707 | /* clear interrupts */ | 712 | /* clear interrupts */ |
708 | iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); | 713 | iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); |
@@ -768,7 +773,8 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich | |||
768 | ichdev->lvi_frag %= ichdev->frags; | 773 | ichdev->lvi_frag %= ichdev->frags; |
769 | ichdev->bdbar[ichdev->lvi * 2] = cpu_to_le32(ichdev->physbuf + ichdev->lvi_frag * ichdev->fragsize1); | 774 | ichdev->bdbar[ichdev->lvi * 2] = cpu_to_le32(ichdev->physbuf + ichdev->lvi_frag * ichdev->fragsize1); |
770 | #if 0 | 775 | #if 0 |
771 | printk("new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, all = 0x%x, 0x%x\n", | 776 | printk(KERN_DEBUG "new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, " |
777 | "all = 0x%x, 0x%x\n", | ||
772 | ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2], | 778 | ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2], |
773 | ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port), | 779 | ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port), |
774 | inl(port + 4), inb(port + ICH_REG_OFF_CR)); | 780 | inl(port + 4), inb(port + ICH_REG_OFF_CR)); |
@@ -835,7 +841,10 @@ static int snd_intel8x0_pcm_trigger(struct snd_pcm_substream *substream, int cmd | |||
835 | ichdev->suspended = 0; | 841 | ichdev->suspended = 0; |
836 | /* fallthru */ | 842 | /* fallthru */ |
837 | case SNDRV_PCM_TRIGGER_START: | 843 | case SNDRV_PCM_TRIGGER_START: |
844 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | ||
838 | val = ICH_IOCE | ICH_STARTBM; | 845 | val = ICH_IOCE | ICH_STARTBM; |
846 | ichdev->last_pos = ichdev->position; | ||
847 | ichdev->last_pos_jiffies = jiffies; | ||
839 | break; | 848 | break; |
840 | case SNDRV_PCM_TRIGGER_SUSPEND: | 849 | case SNDRV_PCM_TRIGGER_SUSPEND: |
841 | ichdev->suspended = 1; | 850 | ichdev->suspended = 1; |
@@ -846,9 +855,6 @@ static int snd_intel8x0_pcm_trigger(struct snd_pcm_substream *substream, int cmd | |||
846 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 855 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
847 | val = ICH_IOCE; | 856 | val = ICH_IOCE; |
848 | break; | 857 | break; |
849 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | ||
850 | val = ICH_IOCE | ICH_STARTBM; | ||
851 | break; | ||
852 | default: | 858 | default: |
853 | return -EINVAL; | 859 | return -EINVAL; |
854 | } | 860 | } |
@@ -1042,6 +1048,7 @@ static int snd_intel8x0_pcm_prepare(struct snd_pcm_substream *substream) | |||
1042 | ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1; | 1048 | ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1; |
1043 | } | 1049 | } |
1044 | snd_intel8x0_setup_periods(chip, ichdev); | 1050 | snd_intel8x0_setup_periods(chip, ichdev); |
1051 | ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ; | ||
1045 | return 0; | 1052 | return 0; |
1046 | } | 1053 | } |
1047 | 1054 | ||
@@ -1050,7 +1057,7 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs | |||
1050 | struct intel8x0 *chip = snd_pcm_substream_chip(substream); | 1057 | struct intel8x0 *chip = snd_pcm_substream_chip(substream); |
1051 | struct ichdev *ichdev = get_ichdev(substream); | 1058 | struct ichdev *ichdev = get_ichdev(substream); |
1052 | size_t ptr1, ptr; | 1059 | size_t ptr1, ptr; |
1053 | int civ, timeout = 100; | 1060 | int civ, timeout = 10; |
1054 | unsigned int position; | 1061 | unsigned int position; |
1055 | 1062 | ||
1056 | spin_lock(&chip->reg_lock); | 1063 | spin_lock(&chip->reg_lock); |
@@ -1066,9 +1073,19 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs | |||
1066 | ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) | 1073 | ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) |
1067 | break; | 1074 | break; |
1068 | } while (timeout--); | 1075 | } while (timeout--); |
1069 | ptr1 <<= ichdev->pos_shift; | 1076 | if (ptr1 != 0) { |
1070 | ptr = ichdev->fragsize1 - ptr1; | 1077 | ptr1 <<= ichdev->pos_shift; |
1071 | ptr += position; | 1078 | ptr = ichdev->fragsize1 - ptr1; |
1079 | ptr += position; | ||
1080 | ichdev->last_pos = ptr; | ||
1081 | ichdev->last_pos_jiffies = jiffies; | ||
1082 | } else { | ||
1083 | ptr1 = jiffies - ichdev->last_pos_jiffies; | ||
1084 | if (ptr1) | ||
1085 | ptr1 -= 1; | ||
1086 | ptr = ichdev->last_pos + ptr1 * ichdev->jiffy_to_bytes; | ||
1087 | ptr %= ichdev->size; | ||
1088 | } | ||
1072 | spin_unlock(&chip->reg_lock); | 1089 | spin_unlock(&chip->reg_lock); |
1073 | if (ptr >= ichdev->size) | 1090 | if (ptr >= ichdev->size) |
1074 | return 0; | 1091 | return 0; |
@@ -1837,6 +1854,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1837 | }, | 1854 | }, |
1838 | { | 1855 | { |
1839 | .subvendor = 0x1028, | 1856 | .subvendor = 0x1028, |
1857 | .subdevice = 0x016a, | ||
1858 | .name = "Dell Inspiron 8600", /* STAC9750/51 */ | ||
1859 | .type = AC97_TUNE_HP_ONLY | ||
1860 | }, | ||
1861 | { | ||
1862 | .subvendor = 0x1028, | ||
1840 | .subdevice = 0x0186, | 1863 | .subdevice = 0x0186, |
1841 | .name = "Dell Latitude D810", /* cf. Malone #41015 */ | 1864 | .name = "Dell Latitude D810", /* cf. Malone #41015 */ |
1842 | .type = AC97_TUNE_HP_MUTE_LED | 1865 | .type = AC97_TUNE_HP_MUTE_LED |
@@ -1879,12 +1902,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1879 | }, | 1902 | }, |
1880 | { | 1903 | { |
1881 | .subvendor = 0x103c, | 1904 | .subvendor = 0x103c, |
1882 | .subdevice = 0x0934, | ||
1883 | .name = "HP nx8220", | ||
1884 | .type = AC97_TUNE_MUTE_LED | ||
1885 | }, | ||
1886 | { | ||
1887 | .subvendor = 0x103c, | ||
1888 | .subdevice = 0x129d, | 1905 | .subdevice = 0x129d, |
1889 | .name = "HP xw8000", | 1906 | .name = "HP xw8000", |
1890 | .type = AC97_TUNE_HP_ONLY | 1907 | .type = AC97_TUNE_HP_ONLY |
@@ -2287,23 +2304,23 @@ static void do_ali_reset(struct intel8x0 *chip) | |||
2287 | iputdword(chip, ICHREG(ALI_INTERRUPTSR), 0x00000000); | 2304 | iputdword(chip, ICHREG(ALI_INTERRUPTSR), 0x00000000); |
2288 | } | 2305 | } |
2289 | 2306 | ||
2290 | static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing) | 2307 | #ifdef CONFIG_SND_AC97_POWER_SAVE |
2291 | { | 2308 | static struct snd_pci_quirk ich_chip_reset_mode[] = { |
2292 | unsigned long end_time; | 2309 | SND_PCI_QUIRK(0x1014, 0x051f, "Thinkpad R32", 1), |
2293 | unsigned int cnt, status, nstatus; | 2310 | { } /* end */ |
2294 | 2311 | }; | |
2295 | /* put logic to right state */ | ||
2296 | /* first clear status bits */ | ||
2297 | status = ICH_RCS | ICH_MCINT | ICH_POINT | ICH_PIINT; | ||
2298 | if (chip->device_type == DEVICE_NFORCE) | ||
2299 | status |= ICH_NVSPINT; | ||
2300 | cnt = igetdword(chip, ICHREG(GLOB_STA)); | ||
2301 | iputdword(chip, ICHREG(GLOB_STA), cnt & status); | ||
2302 | 2312 | ||
2313 | static int snd_intel8x0_ich_chip_cold_reset(struct intel8x0 *chip) | ||
2314 | { | ||
2315 | unsigned int cnt; | ||
2303 | /* ACLink on, 2 channels */ | 2316 | /* ACLink on, 2 channels */ |
2317 | |||
2318 | if (snd_pci_quirk_lookup(chip->pci, ich_chip_reset_mode)) | ||
2319 | return -EIO; | ||
2320 | |||
2304 | cnt = igetdword(chip, ICHREG(GLOB_CNT)); | 2321 | cnt = igetdword(chip, ICHREG(GLOB_CNT)); |
2305 | cnt &= ~(ICH_ACLINK | ICH_PCM_246_MASK); | 2322 | cnt &= ~(ICH_ACLINK | ICH_PCM_246_MASK); |
2306 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 2323 | |
2307 | /* do cold reset - the full ac97 powerdown may leave the controller | 2324 | /* do cold reset - the full ac97 powerdown may leave the controller |
2308 | * in a warm state but actually it cannot communicate with the codec. | 2325 | * in a warm state but actually it cannot communicate with the codec. |
2309 | */ | 2326 | */ |
@@ -2312,22 +2329,58 @@ static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing) | |||
2312 | udelay(10); | 2329 | udelay(10); |
2313 | iputdword(chip, ICHREG(GLOB_CNT), cnt | ICH_AC97COLD); | 2330 | iputdword(chip, ICHREG(GLOB_CNT), cnt | ICH_AC97COLD); |
2314 | msleep(1); | 2331 | msleep(1); |
2332 | return 0; | ||
2333 | } | ||
2334 | #define snd_intel8x0_ich_chip_can_cold_reset(chip) \ | ||
2335 | (!snd_pci_quirk_lookup(chip->pci, ich_chip_reset_mode)) | ||
2315 | #else | 2336 | #else |
2337 | #define snd_intel8x0_ich_chip_cold_reset(chip) 0 | ||
2338 | #define snd_intel8x0_ich_chip_can_cold_reset(chip) (0) | ||
2339 | #endif | ||
2340 | |||
2341 | static int snd_intel8x0_ich_chip_reset(struct intel8x0 *chip) | ||
2342 | { | ||
2343 | unsigned long end_time; | ||
2344 | unsigned int cnt; | ||
2345 | /* ACLink on, 2 channels */ | ||
2346 | cnt = igetdword(chip, ICHREG(GLOB_CNT)); | ||
2347 | cnt &= ~(ICH_ACLINK | ICH_PCM_246_MASK); | ||
2316 | /* finish cold or do warm reset */ | 2348 | /* finish cold or do warm reset */ |
2317 | cnt |= (cnt & ICH_AC97COLD) == 0 ? ICH_AC97COLD : ICH_AC97WARM; | 2349 | cnt |= (cnt & ICH_AC97COLD) == 0 ? ICH_AC97COLD : ICH_AC97WARM; |
2318 | iputdword(chip, ICHREG(GLOB_CNT), cnt); | 2350 | iputdword(chip, ICHREG(GLOB_CNT), cnt); |
2319 | end_time = (jiffies + (HZ / 4)) + 1; | 2351 | end_time = (jiffies + (HZ / 4)) + 1; |
2320 | do { | 2352 | do { |
2321 | if ((igetdword(chip, ICHREG(GLOB_CNT)) & ICH_AC97WARM) == 0) | 2353 | if ((igetdword(chip, ICHREG(GLOB_CNT)) & ICH_AC97WARM) == 0) |
2322 | goto __ok; | 2354 | return 0; |
2323 | schedule_timeout_uninterruptible(1); | 2355 | schedule_timeout_uninterruptible(1); |
2324 | } while (time_after_eq(end_time, jiffies)); | 2356 | } while (time_after_eq(end_time, jiffies)); |
2325 | snd_printk(KERN_ERR "AC'97 warm reset still in progress? [0x%x]\n", | 2357 | snd_printk(KERN_ERR "AC'97 warm reset still in progress? [0x%x]\n", |
2326 | igetdword(chip, ICHREG(GLOB_CNT))); | 2358 | igetdword(chip, ICHREG(GLOB_CNT))); |
2327 | return -EIO; | 2359 | return -EIO; |
2360 | } | ||
2361 | |||
2362 | static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing) | ||
2363 | { | ||
2364 | unsigned long end_time; | ||
2365 | unsigned int status, nstatus; | ||
2366 | unsigned int cnt; | ||
2367 | int err; | ||
2368 | |||
2369 | /* put logic to right state */ | ||
2370 | /* first clear status bits */ | ||
2371 | status = ICH_RCS | ICH_MCINT | ICH_POINT | ICH_PIINT; | ||
2372 | if (chip->device_type == DEVICE_NFORCE) | ||
2373 | status |= ICH_NVSPINT; | ||
2374 | cnt = igetdword(chip, ICHREG(GLOB_STA)); | ||
2375 | iputdword(chip, ICHREG(GLOB_STA), cnt & status); | ||
2376 | |||
2377 | if (snd_intel8x0_ich_chip_can_cold_reset(chip)) | ||
2378 | err = snd_intel8x0_ich_chip_cold_reset(chip); | ||
2379 | else | ||
2380 | err = snd_intel8x0_ich_chip_reset(chip); | ||
2381 | if (err < 0) | ||
2382 | return err; | ||
2328 | 2383 | ||
2329 | __ok: | ||
2330 | #endif | ||
2331 | if (probing) { | 2384 | if (probing) { |
2332 | /* wait for any codec ready status. | 2385 | /* wait for any codec ready status. |
2333 | * Once it becomes ready it should remain ready | 2386 | * Once it becomes ready it should remain ready |
@@ -2622,12 +2675,14 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) | |||
2622 | struct snd_pcm_substream *subs; | 2675 | struct snd_pcm_substream *subs; |
2623 | struct ichdev *ichdev; | 2676 | struct ichdev *ichdev; |
2624 | unsigned long port; | 2677 | unsigned long port; |
2625 | unsigned long pos, t; | 2678 | unsigned long pos, pos1, t; |
2626 | struct timeval start_time, stop_time; | 2679 | int civ, timeout = 1000, attempt = 1; |
2680 | struct timespec start_time, stop_time; | ||
2627 | 2681 | ||
2628 | if (chip->ac97_bus->clock != 48000) | 2682 | if (chip->ac97_bus->clock != 48000) |
2629 | return; /* specified in module option */ | 2683 | return; /* specified in module option */ |
2630 | 2684 | ||
2685 | __again: | ||
2631 | subs = chip->pcm[0]->streams[0].substream; | 2686 | subs = chip->pcm[0]->streams[0].substream; |
2632 | if (! subs || subs->dma_buffer.bytes < INTEL8X0_TESTBUF_SIZE) { | 2687 | if (! subs || subs->dma_buffer.bytes < INTEL8X0_TESTBUF_SIZE) { |
2633 | snd_printk(KERN_WARNING "no playback buffer allocated - aborting measure ac97 clock\n"); | 2688 | snd_printk(KERN_WARNING "no playback buffer allocated - aborting measure ac97 clock\n"); |
@@ -2635,7 +2690,7 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) | |||
2635 | } | 2690 | } |
2636 | ichdev = &chip->ichd[ICHD_PCMOUT]; | 2691 | ichdev = &chip->ichd[ICHD_PCMOUT]; |
2637 | ichdev->physbuf = subs->dma_buffer.addr; | 2692 | ichdev->physbuf = subs->dma_buffer.addr; |
2638 | ichdev->size = chip->ichd[ICHD_PCMOUT].fragsize = INTEL8X0_TESTBUF_SIZE; | 2693 | ichdev->size = ichdev->fragsize = INTEL8X0_TESTBUF_SIZE; |
2639 | ichdev->substream = NULL; /* don't process interrupts */ | 2694 | ichdev->substream = NULL; /* don't process interrupts */ |
2640 | 2695 | ||
2641 | /* set rate */ | 2696 | /* set rate */ |
@@ -2654,16 +2709,31 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) | |||
2654 | iputbyte(chip, port + ICH_REG_OFF_CR, ICH_IOCE); | 2709 | iputbyte(chip, port + ICH_REG_OFF_CR, ICH_IOCE); |
2655 | iputdword(chip, ICHREG(ALI_DMACR), 1 << ichdev->ali_slot); | 2710 | iputdword(chip, ICHREG(ALI_DMACR), 1 << ichdev->ali_slot); |
2656 | } | 2711 | } |
2657 | do_gettimeofday(&start_time); | 2712 | do_posix_clock_monotonic_gettime(&start_time); |
2658 | spin_unlock_irq(&chip->reg_lock); | 2713 | spin_unlock_irq(&chip->reg_lock); |
2659 | msleep(50); | 2714 | msleep(50); |
2660 | spin_lock_irq(&chip->reg_lock); | 2715 | spin_lock_irq(&chip->reg_lock); |
2661 | /* check the position */ | 2716 | /* check the position */ |
2662 | pos = ichdev->fragsize1; | 2717 | do { |
2663 | pos -= igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << ichdev->pos_shift; | 2718 | civ = igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV); |
2664 | pos += ichdev->position; | 2719 | pos1 = igetword(chip, ichdev->reg_offset + ichdev->roff_picb); |
2720 | if (pos1 == 0) { | ||
2721 | udelay(10); | ||
2722 | continue; | ||
2723 | } | ||
2724 | if (civ == igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV) && | ||
2725 | pos1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) | ||
2726 | break; | ||
2727 | } while (timeout--); | ||
2728 | if (pos1 == 0) { /* oops, this value is not reliable */ | ||
2729 | pos = 0; | ||
2730 | } else { | ||
2731 | pos = ichdev->fragsize1; | ||
2732 | pos -= pos1 << ichdev->pos_shift; | ||
2733 | pos += ichdev->position; | ||
2734 | } | ||
2665 | chip->in_measurement = 0; | 2735 | chip->in_measurement = 0; |
2666 | do_gettimeofday(&stop_time); | 2736 | do_posix_clock_monotonic_gettime(&stop_time); |
2667 | /* stop */ | 2737 | /* stop */ |
2668 | if (chip->device_type == DEVICE_ALI) { | 2738 | if (chip->device_type == DEVICE_ALI) { |
2669 | iputdword(chip, ICHREG(ALI_DMACR), 1 << (ichdev->ali_slot + 16)); | 2739 | iputdword(chip, ICHREG(ALI_DMACR), 1 << (ichdev->ali_slot + 16)); |
@@ -2678,22 +2748,42 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) | |||
2678 | iputbyte(chip, port + ICH_REG_OFF_CR, ICH_RESETREGS); | 2748 | iputbyte(chip, port + ICH_REG_OFF_CR, ICH_RESETREGS); |
2679 | spin_unlock_irq(&chip->reg_lock); | 2749 | spin_unlock_irq(&chip->reg_lock); |
2680 | 2750 | ||
2751 | if (pos == 0) { | ||
2752 | snd_printk(KERN_ERR "intel8x0: measure - unreliable DMA position..\n"); | ||
2753 | __retry: | ||
2754 | if (attempt < 3) { | ||
2755 | msleep(300); | ||
2756 | attempt++; | ||
2757 | goto __again; | ||
2758 | } | ||
2759 | goto __end; | ||
2760 | } | ||
2761 | |||
2762 | pos /= 4; | ||
2681 | t = stop_time.tv_sec - start_time.tv_sec; | 2763 | t = stop_time.tv_sec - start_time.tv_sec; |
2682 | t *= 1000000; | 2764 | t *= 1000000; |
2683 | t += stop_time.tv_usec - start_time.tv_usec; | 2765 | t += (stop_time.tv_nsec - start_time.tv_nsec) / 1000; |
2684 | printk(KERN_INFO "%s: measured %lu usecs\n", __func__, t); | 2766 | printk(KERN_INFO "%s: measured %lu usecs (%lu samples)\n", __func__, t, pos); |
2685 | if (t == 0) { | 2767 | if (t == 0) { |
2686 | snd_printk(KERN_ERR "?? calculation error..\n"); | 2768 | snd_printk(KERN_ERR "intel8x0: ?? calculation error..\n"); |
2687 | return; | 2769 | goto __retry; |
2688 | } | 2770 | } |
2689 | pos = (pos / 4) * 1000; | 2771 | pos *= 1000; |
2690 | pos = (pos / t) * 1000 + ((pos % t) * 1000) / t; | 2772 | pos = (pos / t) * 1000 + ((pos % t) * 1000) / t; |
2691 | if (pos < 40000 || pos >= 60000) | 2773 | if (pos < 40000 || pos >= 60000) { |
2692 | /* abnormal value. hw problem? */ | 2774 | /* abnormal value. hw problem? */ |
2693 | printk(KERN_INFO "intel8x0: measured clock %ld rejected\n", pos); | 2775 | printk(KERN_INFO "intel8x0: measured clock %ld rejected\n", pos); |
2776 | goto __retry; | ||
2777 | } else if (pos > 40500 && pos < 41500) | ||
2778 | /* first exception - 41000Hz reference clock */ | ||
2779 | chip->ac97_bus->clock = 41000; | ||
2780 | else if (pos > 43600 && pos < 44600) | ||
2781 | /* second exception - 44100HZ reference clock */ | ||
2782 | chip->ac97_bus->clock = 44100; | ||
2694 | else if (pos < 47500 || pos > 48500) | 2783 | else if (pos < 47500 || pos > 48500) |
2695 | /* not 48000Hz, tuning the clock.. */ | 2784 | /* not 48000Hz, tuning the clock.. */ |
2696 | chip->ac97_bus->clock = (chip->ac97_bus->clock * 48000) / pos; | 2785 | chip->ac97_bus->clock = (chip->ac97_bus->clock * 48000) / pos; |
2786 | __end: | ||
2697 | printk(KERN_INFO "intel8x0: clocking to %d\n", chip->ac97_bus->clock); | 2787 | printk(KERN_INFO "intel8x0: clocking to %d\n", chip->ac97_bus->clock); |
2698 | snd_ac97_update_power(chip->ac97[0], AC97_PCM_FRONT_DAC_RATE, 0); | 2788 | snd_ac97_update_power(chip->ac97[0], AC97_PCM_FRONT_DAC_RATE, 0); |
2699 | } | 2789 | } |
diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 33a843c19316..6ec0fc50d6be 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c | |||
@@ -411,7 +411,10 @@ static void snd_intel8x0_setup_periods(struct intel8x0m *chip, struct ichdev *ic | |||
411 | bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf + (((idx >> 1) * ichdev->fragsize) % ichdev->size)); | 411 | bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf + (((idx >> 1) * ichdev->fragsize) % ichdev->size)); |
412 | bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ | 412 | bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ |
413 | ichdev->fragsize >> chip->pcm_pos_shift); | 413 | ichdev->fragsize >> chip->pcm_pos_shift); |
414 | // printk("bdbar[%i] = 0x%x [0x%x]\n", idx + 0, bdbar[idx + 0], bdbar[idx + 1]); | 414 | /* |
415 | printk(KERN_DEBUG "bdbar[%i] = 0x%x [0x%x]\n", | ||
416 | idx + 0, bdbar[idx + 0], bdbar[idx + 1]); | ||
417 | */ | ||
415 | } | 418 | } |
416 | ichdev->frags = ichdev->size / ichdev->fragsize; | 419 | ichdev->frags = ichdev->size / ichdev->fragsize; |
417 | } | 420 | } |
@@ -421,8 +424,10 @@ static void snd_intel8x0_setup_periods(struct intel8x0m *chip, struct ichdev *ic | |||
421 | ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags; | 424 | ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags; |
422 | ichdev->position = 0; | 425 | ichdev->position = 0; |
423 | #if 0 | 426 | #if 0 |
424 | printk("lvi_frag = %i, frags = %i, period_size = 0x%x, period_size1 = 0x%x\n", | 427 | printk(KERN_DEBUG "lvi_frag = %i, frags = %i, period_size = 0x%x, " |
425 | ichdev->lvi_frag, ichdev->frags, ichdev->fragsize, ichdev->fragsize1); | 428 | "period_size1 = 0x%x\n", |
429 | ichdev->lvi_frag, ichdev->frags, ichdev->fragsize, | ||
430 | ichdev->fragsize1); | ||
426 | #endif | 431 | #endif |
427 | /* clear interrupts */ | 432 | /* clear interrupts */ |
428 | iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); | 433 | iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); |
@@ -465,7 +470,8 @@ static inline void snd_intel8x0_update(struct intel8x0m *chip, struct ichdev *ic | |||
465 | ichdev->lvi_frag * | 470 | ichdev->lvi_frag * |
466 | ichdev->fragsize1); | 471 | ichdev->fragsize1); |
467 | #if 0 | 472 | #if 0 |
468 | printk("new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, all = 0x%x, 0x%x\n", | 473 | printk(KERN_DEBUG "new: bdbar[%i] = 0x%x [0x%x], " |
474 | "prefetch = %i, all = 0x%x, 0x%x\n", | ||
469 | ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2], | 475 | ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2], |
470 | ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port), | 476 | ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port), |
471 | inl(port + 4), inb(port + ICH_REG_OFF_CR)); | 477 | inl(port + 4), inb(port + ICH_REG_OFF_CR)); |
diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index 8b79969034be..7cc38a11e997 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c | |||
@@ -1238,7 +1238,8 @@ static struct snd_pcm_hardware snd_korg1212_playback_info = | |||
1238 | { | 1238 | { |
1239 | .info = (SNDRV_PCM_INFO_MMAP | | 1239 | .info = (SNDRV_PCM_INFO_MMAP | |
1240 | SNDRV_PCM_INFO_MMAP_VALID | | 1240 | SNDRV_PCM_INFO_MMAP_VALID | |
1241 | SNDRV_PCM_INFO_INTERLEAVED), | 1241 | SNDRV_PCM_INFO_INTERLEAVED | |
1242 | SNDRV_PCM_INFO_BATCH), | ||
1242 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 1243 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
1243 | .rates = (SNDRV_PCM_RATE_44100 | | 1244 | .rates = (SNDRV_PCM_RATE_44100 | |
1244 | SNDRV_PCM_RATE_48000), | 1245 | SNDRV_PCM_RATE_48000), |
@@ -1258,7 +1259,8 @@ static struct snd_pcm_hardware snd_korg1212_capture_info = | |||
1258 | { | 1259 | { |
1259 | .info = (SNDRV_PCM_INFO_MMAP | | 1260 | .info = (SNDRV_PCM_INFO_MMAP | |
1260 | SNDRV_PCM_INFO_MMAP_VALID | | 1261 | SNDRV_PCM_INFO_MMAP_VALID | |
1261 | SNDRV_PCM_INFO_INTERLEAVED), | 1262 | SNDRV_PCM_INFO_INTERLEAVED | |
1263 | SNDRV_PCM_INFO_BATCH), | ||
1262 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 1264 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
1263 | .rates = (SNDRV_PCM_RATE_44100 | | 1265 | .rates = (SNDRV_PCM_RATE_44100 | |
1264 | SNDRV_PCM_RATE_48000), | 1266 | SNDRV_PCM_RATE_48000), |
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 70141548f251..75283fbb4b3f 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c | |||
@@ -2530,8 +2530,8 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, | |||
2530 | return -EIO; | 2530 | return -EIO; |
2531 | 2531 | ||
2532 | /* check, if we can restrict PCI DMA transfers to 28 bits */ | 2532 | /* check, if we can restrict PCI DMA transfers to 28 bits */ |
2533 | if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | 2533 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 || |
2534 | pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | 2534 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { |
2535 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); | 2535 | snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); |
2536 | pci_disable_device(pci); | 2536 | pci_disable_device(pci); |
2537 | return -ENXIO; | 2537 | return -ENXIO; |
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index bfc19e36c4b6..82bc5b9e7629 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c | |||
@@ -607,6 +607,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs, | |||
607 | /* set the format to the board */ | 607 | /* set the format to the board */ |
608 | err = mixart_set_format(stream, format); | 608 | err = mixart_set_format(stream, format); |
609 | if(err < 0) { | 609 | if(err < 0) { |
610 | mutex_unlock(&mgr->setup_mutex); | ||
610 | return err; | 611 | return err; |
611 | } | 612 | } |
612 | 613 | ||
@@ -1290,7 +1291,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, | |||
1290 | pci_set_master(pci); | 1291 | pci_set_master(pci); |
1291 | 1292 | ||
1292 | /* check if we can restrict PCI DMA transfers to 32 bits */ | 1293 | /* check if we can restrict PCI DMA transfers to 32 bits */ |
1293 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 1294 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
1294 | snd_printk(KERN_ERR "architecture does not support 32bit PCI busmaster DMA\n"); | 1295 | snd_printk(KERN_ERR "architecture does not support 32bit PCI busmaster DMA\n"); |
1295 | pci_disable_device(pci); | 1296 | pci_disable_device(pci); |
1296 | return -ENXIO; | 1297 | return -ENXIO; |
diff --git a/sound/pci/mixart/mixart_hwdep.c b/sound/pci/mixart/mixart_hwdep.c index 3782b52bc0e8..4cf4cd8c939c 100644 --- a/sound/pci/mixart/mixart_hwdep.c +++ b/sound/pci/mixart/mixart_hwdep.c | |||
@@ -345,8 +345,8 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
345 | status_daught = readl_be( MIXART_MEM( mgr,MIXART_PSEUDOREG_DXLX_STATUS_OFFSET )); | 345 | status_daught = readl_be( MIXART_MEM( mgr,MIXART_PSEUDOREG_DXLX_STATUS_OFFSET )); |
346 | 346 | ||
347 | /* motherboard xilinx status 5 will say that the board is performing a reset */ | 347 | /* motherboard xilinx status 5 will say that the board is performing a reset */ |
348 | if( status_xilinx == 5 ) { | 348 | if (status_xilinx == 5) { |
349 | snd_printk( KERN_ERR "miXart is resetting !\n"); | 349 | snd_printk(KERN_ERR "miXart is resetting !\n"); |
350 | return -EAGAIN; /* try again later */ | 350 | return -EAGAIN; /* try again later */ |
351 | } | 351 | } |
352 | 352 | ||
@@ -354,13 +354,14 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
354 | case MIXART_MOTHERBOARD_XLX_INDEX: | 354 | case MIXART_MOTHERBOARD_XLX_INDEX: |
355 | 355 | ||
356 | /* xilinx already loaded ? */ | 356 | /* xilinx already loaded ? */ |
357 | if( status_xilinx == 4 ) { | 357 | if (status_xilinx == 4) { |
358 | snd_printk( KERN_DEBUG "xilinx is already loaded !\n"); | 358 | snd_printk(KERN_DEBUG "xilinx is already loaded !\n"); |
359 | return 0; | 359 | return 0; |
360 | } | 360 | } |
361 | /* the status should be 0 == "idle" */ | 361 | /* the status should be 0 == "idle" */ |
362 | if( status_xilinx != 0 ) { | 362 | if (status_xilinx != 0) { |
363 | snd_printk( KERN_ERR "xilinx load error ! status = %d\n", status_xilinx); | 363 | snd_printk(KERN_ERR "xilinx load error ! status = %d\n", |
364 | status_xilinx); | ||
364 | return -EIO; /* modprob -r may help ? */ | 365 | return -EIO; /* modprob -r may help ? */ |
365 | } | 366 | } |
366 | 367 | ||
@@ -389,21 +390,23 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
389 | 390 | ||
390 | case MIXART_MOTHERBOARD_ELF_INDEX: | 391 | case MIXART_MOTHERBOARD_ELF_INDEX: |
391 | 392 | ||
392 | if( status_elf == 4 ) { | 393 | if (status_elf == 4) { |
393 | snd_printk( KERN_DEBUG "elf file already loaded !\n"); | 394 | snd_printk(KERN_DEBUG "elf file already loaded !\n"); |
394 | return 0; | 395 | return 0; |
395 | } | 396 | } |
396 | 397 | ||
397 | /* the status should be 0 == "idle" */ | 398 | /* the status should be 0 == "idle" */ |
398 | if( status_elf != 0 ) { | 399 | if (status_elf != 0) { |
399 | snd_printk( KERN_ERR "elf load error ! status = %d\n", status_elf); | 400 | snd_printk(KERN_ERR "elf load error ! status = %d\n", |
401 | status_elf); | ||
400 | return -EIO; /* modprob -r may help ? */ | 402 | return -EIO; /* modprob -r may help ? */ |
401 | } | 403 | } |
402 | 404 | ||
403 | /* wait for xilinx status == 4 */ | 405 | /* wait for xilinx status == 4 */ |
404 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_MXLX_STATUS_OFFSET, 1, 4, 500); /* 5sec */ | 406 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_MXLX_STATUS_OFFSET, 1, 4, 500); /* 5sec */ |
405 | if (err < 0) { | 407 | if (err < 0) { |
406 | snd_printk( KERN_ERR "xilinx was not loaded or could not be started\n"); | 408 | snd_printk(KERN_ERR "xilinx was not loaded or " |
409 | "could not be started\n"); | ||
407 | return err; | 410 | return err; |
408 | } | 411 | } |
409 | 412 | ||
@@ -424,7 +427,7 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
424 | /* wait for elf status == 4 */ | 427 | /* wait for elf status == 4 */ |
425 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_ELF_STATUS_OFFSET, 1, 4, 300); /* 3sec */ | 428 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_ELF_STATUS_OFFSET, 1, 4, 300); /* 3sec */ |
426 | if (err < 0) { | 429 | if (err < 0) { |
427 | snd_printk( KERN_ERR "elf could not be started\n"); | 430 | snd_printk(KERN_ERR "elf could not be started\n"); |
428 | return err; | 431 | return err; |
429 | } | 432 | } |
430 | 433 | ||
@@ -437,15 +440,16 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
437 | default: | 440 | default: |
438 | 441 | ||
439 | /* elf and xilinx should be loaded */ | 442 | /* elf and xilinx should be loaded */ |
440 | if( (status_elf != 4) || (status_xilinx != 4) ) { | 443 | if (status_elf != 4 || status_xilinx != 4) { |
441 | printk( KERN_ERR "xilinx or elf not successfully loaded\n"); | 444 | printk(KERN_ERR "xilinx or elf not " |
445 | "successfully loaded\n"); | ||
442 | return -EIO; /* modprob -r may help ? */ | 446 | return -EIO; /* modprob -r may help ? */ |
443 | } | 447 | } |
444 | 448 | ||
445 | /* wait for daughter detection != 0 */ | 449 | /* wait for daughter detection != 0 */ |
446 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DBRD_PRESENCE_OFFSET, 0, 0, 30); /* 300msec */ | 450 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DBRD_PRESENCE_OFFSET, 0, 0, 30); /* 300msec */ |
447 | if (err < 0) { | 451 | if (err < 0) { |
448 | snd_printk( KERN_ERR "error starting elf file\n"); | 452 | snd_printk(KERN_ERR "error starting elf file\n"); |
449 | return err; | 453 | return err; |
450 | } | 454 | } |
451 | 455 | ||
@@ -460,8 +464,9 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
460 | return -EINVAL; | 464 | return -EINVAL; |
461 | 465 | ||
462 | /* daughter should be idle */ | 466 | /* daughter should be idle */ |
463 | if( status_daught != 0 ) { | 467 | if (status_daught != 0) { |
464 | printk( KERN_ERR "daughter load error ! status = %d\n", status_daught); | 468 | printk(KERN_ERR "daughter load error ! status = %d\n", |
469 | status_daught); | ||
465 | return -EIO; /* modprob -r may help ? */ | 470 | return -EIO; /* modprob -r may help ? */ |
466 | } | 471 | } |
467 | 472 | ||
@@ -480,7 +485,7 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
480 | /* wait for status == 2 */ | 485 | /* wait for status == 2 */ |
481 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DXLX_STATUS_OFFSET, 1, 2, 30); /* 300msec */ | 486 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DXLX_STATUS_OFFSET, 1, 2, 30); /* 300msec */ |
482 | if (err < 0) { | 487 | if (err < 0) { |
483 | snd_printk( KERN_ERR "daughter board load error\n"); | 488 | snd_printk(KERN_ERR "daughter board load error\n"); |
484 | return err; | 489 | return err; |
485 | } | 490 | } |
486 | 491 | ||
@@ -502,7 +507,8 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
502 | /* wait for daughter status == 3 */ | 507 | /* wait for daughter status == 3 */ |
503 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DXLX_STATUS_OFFSET, 1, 3, 300); /* 3sec */ | 508 | err = mixart_wait_nice_for_register_value( mgr, MIXART_PSEUDOREG_DXLX_STATUS_OFFSET, 1, 3, 300); /* 3sec */ |
504 | if (err < 0) { | 509 | if (err < 0) { |
505 | snd_printk( KERN_ERR "daughter board could not be initialised\n"); | 510 | snd_printk(KERN_ERR |
511 | "daughter board could not be initialised\n"); | ||
506 | return err; | 512 | return err; |
507 | } | 513 | } |
508 | 514 | ||
@@ -512,7 +518,7 @@ static int mixart_dsp_load(struct mixart_mgr* mgr, int index, const struct firmw | |||
512 | /* first communication with embedded */ | 518 | /* first communication with embedded */ |
513 | err = mixart_first_init(mgr); | 519 | err = mixart_first_init(mgr); |
514 | if (err < 0) { | 520 | if (err < 0) { |
515 | snd_printk( KERN_ERR "miXart could not be set up\n"); | 521 | snd_printk(KERN_ERR "miXart could not be set up\n"); |
516 | return err; | 522 | return err; |
517 | } | 523 | } |
518 | 524 | ||
@@ -581,16 +587,6 @@ MODULE_FIRMWARE("mixart/miXart8AES.xlx"); | |||
581 | /* miXart hwdep interface id string */ | 587 | /* miXart hwdep interface id string */ |
582 | #define SND_MIXART_HWDEP_ID "miXart Loader" | 588 | #define SND_MIXART_HWDEP_ID "miXart Loader" |
583 | 589 | ||
584 | static int mixart_hwdep_open(struct snd_hwdep *hw, struct file *file) | ||
585 | { | ||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | static int mixart_hwdep_release(struct snd_hwdep *hw, struct file *file) | ||
590 | { | ||
591 | return 0; | ||
592 | } | ||
593 | |||
594 | static int mixart_hwdep_dsp_status(struct snd_hwdep *hw, | 590 | static int mixart_hwdep_dsp_status(struct snd_hwdep *hw, |
595 | struct snd_hwdep_dsp_status *info) | 591 | struct snd_hwdep_dsp_status *info) |
596 | { | 592 | { |
@@ -643,8 +639,6 @@ int snd_mixart_setup_firmware(struct mixart_mgr *mgr) | |||
643 | 639 | ||
644 | hw->iface = SNDRV_HWDEP_IFACE_MIXART; | 640 | hw->iface = SNDRV_HWDEP_IFACE_MIXART; |
645 | hw->private_data = mgr; | 641 | hw->private_data = mgr; |
646 | hw->ops.open = mixart_hwdep_open; | ||
647 | hw->ops.release = mixart_hwdep_release; | ||
648 | hw->ops.dsp_status = mixart_hwdep_dsp_status; | 642 | hw->ops.dsp_status = mixart_hwdep_dsp_status; |
649 | hw->ops.dsp_load = mixart_hwdep_dsp_load; | 643 | hw->ops.dsp_load = mixart_hwdep_dsp_load; |
650 | hw->exclusive = 1; | 644 | hw->exclusive = 1; |
diff --git a/sound/pci/oxygen/hifier.c b/sound/pci/oxygen/hifier.c index 1ab833f843eb..84ef13183419 100644 --- a/sound/pci/oxygen/hifier.c +++ b/sound/pci/oxygen/hifier.c | |||
@@ -45,6 +45,7 @@ MODULE_PARM_DESC(enable, "enable card"); | |||
45 | static struct pci_device_id hifier_ids[] __devinitdata = { | 45 | static struct pci_device_id hifier_ids[] __devinitdata = { |
46 | { OXYGEN_PCI_SUBID(0x14c3, 0x1710) }, | 46 | { OXYGEN_PCI_SUBID(0x14c3, 0x1710) }, |
47 | { OXYGEN_PCI_SUBID(0x14c3, 0x1711) }, | 47 | { OXYGEN_PCI_SUBID(0x14c3, 0x1711) }, |
48 | { OXYGEN_PCI_SUBID_BROKEN_EEPROM }, | ||
48 | { } | 49 | { } |
49 | }; | 50 | }; |
50 | MODULE_DEVICE_TABLE(pci, hifier_ids); | 51 | MODULE_DEVICE_TABLE(pci, hifier_ids); |
@@ -151,7 +152,6 @@ static const struct oxygen_model model_hifier = { | |||
151 | .shortname = "C-Media CMI8787", | 152 | .shortname = "C-Media CMI8787", |
152 | .longname = "C-Media Oxygen HD Audio", | 153 | .longname = "C-Media Oxygen HD Audio", |
153 | .chip = "CMI8788", | 154 | .chip = "CMI8788", |
154 | .owner = THIS_MODULE, | ||
155 | .init = hifier_init, | 155 | .init = hifier_init, |
156 | .control_filter = hifier_control_filter, | 156 | .control_filter = hifier_control_filter, |
157 | .cleanup = hifier_cleanup, | 157 | .cleanup = hifier_cleanup, |
@@ -173,6 +173,13 @@ static const struct oxygen_model model_hifier = { | |||
173 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 173 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static int __devinit get_hifier_model(struct oxygen *chip, | ||
177 | const struct pci_device_id *id) | ||
178 | { | ||
179 | chip->model = model_hifier; | ||
180 | return 0; | ||
181 | } | ||
182 | |||
176 | static int __devinit hifier_probe(struct pci_dev *pci, | 183 | static int __devinit hifier_probe(struct pci_dev *pci, |
177 | const struct pci_device_id *pci_id) | 184 | const struct pci_device_id *pci_id) |
178 | { | 185 | { |
@@ -185,7 +192,8 @@ static int __devinit hifier_probe(struct pci_dev *pci, | |||
185 | ++dev; | 192 | ++dev; |
186 | return -ENOENT; | 193 | return -ENOENT; |
187 | } | 194 | } |
188 | err = oxygen_pci_probe(pci, index[dev], id[dev], &model_hifier, 0); | 195 | err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE, |
196 | hifier_ids, get_hifier_model); | ||
189 | if (err >= 0) | 197 | if (err >= 0) |
190 | ++dev; | 198 | ++dev; |
191 | return err; | 199 | return err; |
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index de999c6d6dd3..72db4c39007f 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * C-Media CMI8788 driver for C-Media's reference design and for the X-Meridian | 2 | * C-Media CMI8788 driver for C-Media's reference design and similar models |
3 | * | 3 | * |
4 | * Copyright (c) Clemens Ladisch <clemens@ladisch.de> | 4 | * Copyright (c) Clemens Ladisch <clemens@ladisch.de> |
5 | * | 5 | * |
@@ -26,6 +26,7 @@ | |||
26 | * | 26 | * |
27 | * GPIO 0 -> DFS0 of AK5385 | 27 | * GPIO 0 -> DFS0 of AK5385 |
28 | * GPIO 1 -> DFS1 of AK5385 | 28 | * GPIO 1 -> DFS1 of AK5385 |
29 | * GPIO 8 -> enable headphone amplifier on HT-Omega models | ||
29 | */ | 30 | */ |
30 | 31 | ||
31 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
@@ -61,7 +62,8 @@ MODULE_PARM_DESC(enable, "enable card"); | |||
61 | enum { | 62 | enum { |
62 | MODEL_CMEDIA_REF, /* C-Media's reference design */ | 63 | MODEL_CMEDIA_REF, /* C-Media's reference design */ |
63 | MODEL_MERIDIAN, /* AuzenTech X-Meridian */ | 64 | MODEL_MERIDIAN, /* AuzenTech X-Meridian */ |
64 | MODEL_HALO, /* HT-Omega Claro halo */ | 65 | MODEL_CLARO, /* HT-Omega Claro */ |
66 | MODEL_CLARO_HALO, /* HT-Omega Claro halo */ | ||
65 | }; | 67 | }; |
66 | 68 | ||
67 | static struct pci_device_id oxygen_ids[] __devinitdata = { | 69 | static struct pci_device_id oxygen_ids[] __devinitdata = { |
@@ -74,8 +76,8 @@ static struct pci_device_id oxygen_ids[] __devinitdata = { | |||
74 | { OXYGEN_PCI_SUBID(0x147a, 0xa017), .driver_data = MODEL_CMEDIA_REF }, | 76 | { OXYGEN_PCI_SUBID(0x147a, 0xa017), .driver_data = MODEL_CMEDIA_REF }, |
75 | { OXYGEN_PCI_SUBID(0x1a58, 0x0910), .driver_data = MODEL_CMEDIA_REF }, | 77 | { OXYGEN_PCI_SUBID(0x1a58, 0x0910), .driver_data = MODEL_CMEDIA_REF }, |
76 | { OXYGEN_PCI_SUBID(0x415a, 0x5431), .driver_data = MODEL_MERIDIAN }, | 78 | { OXYGEN_PCI_SUBID(0x415a, 0x5431), .driver_data = MODEL_MERIDIAN }, |
77 | { OXYGEN_PCI_SUBID(0x7284, 0x9761), .driver_data = MODEL_CMEDIA_REF }, | 79 | { OXYGEN_PCI_SUBID(0x7284, 0x9761), .driver_data = MODEL_CLARO }, |
78 | { OXYGEN_PCI_SUBID(0x7284, 0x9781), .driver_data = MODEL_HALO }, | 80 | { OXYGEN_PCI_SUBID(0x7284, 0x9781), .driver_data = MODEL_CLARO_HALO }, |
79 | { } | 81 | { } |
80 | }; | 82 | }; |
81 | MODULE_DEVICE_TABLE(pci, oxygen_ids); | 83 | MODULE_DEVICE_TABLE(pci, oxygen_ids); |
@@ -86,6 +88,8 @@ MODULE_DEVICE_TABLE(pci, oxygen_ids); | |||
86 | #define GPIO_AK5385_DFS_DOUBLE 0x0001 | 88 | #define GPIO_AK5385_DFS_DOUBLE 0x0001 |
87 | #define GPIO_AK5385_DFS_QUAD 0x0002 | 89 | #define GPIO_AK5385_DFS_QUAD 0x0002 |
88 | 90 | ||
91 | #define GPIO_CLARO_HP 0x0100 | ||
92 | |||
89 | struct generic_data { | 93 | struct generic_data { |
90 | u8 ak4396_ctl2; | 94 | u8 ak4396_ctl2; |
91 | u16 saved_wm8785_registers[2]; | 95 | u16 saved_wm8785_registers[2]; |
@@ -196,10 +200,46 @@ static void meridian_init(struct oxygen *chip) | |||
196 | ak5385_init(chip); | 200 | ak5385_init(chip); |
197 | } | 201 | } |
198 | 202 | ||
203 | static void claro_enable_hp(struct oxygen *chip) | ||
204 | { | ||
205 | msleep(300); | ||
206 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_HP); | ||
207 | oxygen_set_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_HP); | ||
208 | } | ||
209 | |||
210 | static void claro_init(struct oxygen *chip) | ||
211 | { | ||
212 | ak4396_init(chip); | ||
213 | wm8785_init(chip); | ||
214 | claro_enable_hp(chip); | ||
215 | } | ||
216 | |||
217 | static void claro_halo_init(struct oxygen *chip) | ||
218 | { | ||
219 | ak4396_init(chip); | ||
220 | ak5385_init(chip); | ||
221 | claro_enable_hp(chip); | ||
222 | } | ||
223 | |||
199 | static void generic_cleanup(struct oxygen *chip) | 224 | static void generic_cleanup(struct oxygen *chip) |
200 | { | 225 | { |
201 | } | 226 | } |
202 | 227 | ||
228 | static void claro_disable_hp(struct oxygen *chip) | ||
229 | { | ||
230 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_HP); | ||
231 | } | ||
232 | |||
233 | static void claro_cleanup(struct oxygen *chip) | ||
234 | { | ||
235 | claro_disable_hp(chip); | ||
236 | } | ||
237 | |||
238 | static void claro_suspend(struct oxygen *chip) | ||
239 | { | ||
240 | claro_disable_hp(chip); | ||
241 | } | ||
242 | |||
203 | static void generic_resume(struct oxygen *chip) | 243 | static void generic_resume(struct oxygen *chip) |
204 | { | 244 | { |
205 | ak4396_registers_init(chip); | 245 | ak4396_registers_init(chip); |
@@ -211,6 +251,12 @@ static void meridian_resume(struct oxygen *chip) | |||
211 | ak4396_registers_init(chip); | 251 | ak4396_registers_init(chip); |
212 | } | 252 | } |
213 | 253 | ||
254 | static void claro_resume(struct oxygen *chip) | ||
255 | { | ||
256 | ak4396_registers_init(chip); | ||
257 | claro_enable_hp(chip); | ||
258 | } | ||
259 | |||
214 | static void set_ak4396_params(struct oxygen *chip, | 260 | static void set_ak4396_params(struct oxygen *chip, |
215 | struct snd_pcm_hw_params *params) | 261 | struct snd_pcm_hw_params *params) |
216 | { | 262 | { |
@@ -293,30 +339,10 @@ static void set_ak5385_params(struct oxygen *chip, | |||
293 | 339 | ||
294 | static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); | 340 | static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); |
295 | 341 | ||
296 | static int generic_probe(struct oxygen *chip, unsigned long driver_data) | ||
297 | { | ||
298 | if (driver_data == MODEL_MERIDIAN) { | ||
299 | chip->model.init = meridian_init; | ||
300 | chip->model.resume = meridian_resume; | ||
301 | chip->model.set_adc_params = set_ak5385_params; | ||
302 | chip->model.device_config = PLAYBACK_0_TO_I2S | | ||
303 | PLAYBACK_1_TO_SPDIF | | ||
304 | CAPTURE_0_FROM_I2S_2 | | ||
305 | CAPTURE_1_FROM_SPDIF; | ||
306 | } | ||
307 | if (driver_data == MODEL_MERIDIAN || driver_data == MODEL_HALO) { | ||
308 | chip->model.misc_flags = OXYGEN_MISC_MIDI; | ||
309 | chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; | ||
310 | } | ||
311 | return 0; | ||
312 | } | ||
313 | |||
314 | static const struct oxygen_model model_generic = { | 342 | static const struct oxygen_model model_generic = { |
315 | .shortname = "C-Media CMI8788", | 343 | .shortname = "C-Media CMI8788", |
316 | .longname = "C-Media Oxygen HD Audio", | 344 | .longname = "C-Media Oxygen HD Audio", |
317 | .chip = "CMI8788", | 345 | .chip = "CMI8788", |
318 | .owner = THIS_MODULE, | ||
319 | .probe = generic_probe, | ||
320 | .init = generic_init, | 346 | .init = generic_init, |
321 | .cleanup = generic_cleanup, | 347 | .cleanup = generic_cleanup, |
322 | .resume = generic_resume, | 348 | .resume = generic_resume, |
@@ -341,6 +367,42 @@ static const struct oxygen_model model_generic = { | |||
341 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 367 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
342 | }; | 368 | }; |
343 | 369 | ||
370 | static int __devinit get_oxygen_model(struct oxygen *chip, | ||
371 | const struct pci_device_id *id) | ||
372 | { | ||
373 | chip->model = model_generic; | ||
374 | switch (id->driver_data) { | ||
375 | case MODEL_MERIDIAN: | ||
376 | chip->model.init = meridian_init; | ||
377 | chip->model.resume = meridian_resume; | ||
378 | chip->model.set_adc_params = set_ak5385_params; | ||
379 | chip->model.device_config = PLAYBACK_0_TO_I2S | | ||
380 | PLAYBACK_1_TO_SPDIF | | ||
381 | CAPTURE_0_FROM_I2S_2 | | ||
382 | CAPTURE_1_FROM_SPDIF; | ||
383 | break; | ||
384 | case MODEL_CLARO: | ||
385 | chip->model.init = claro_init; | ||
386 | chip->model.cleanup = claro_cleanup; | ||
387 | chip->model.suspend = claro_suspend; | ||
388 | chip->model.resume = claro_resume; | ||
389 | break; | ||
390 | case MODEL_CLARO_HALO: | ||
391 | chip->model.init = claro_halo_init; | ||
392 | chip->model.cleanup = claro_cleanup; | ||
393 | chip->model.suspend = claro_suspend; | ||
394 | chip->model.resume = claro_resume; | ||
395 | chip->model.set_adc_params = set_ak5385_params; | ||
396 | break; | ||
397 | } | ||
398 | if (id->driver_data == MODEL_MERIDIAN || | ||
399 | id->driver_data == MODEL_CLARO_HALO) { | ||
400 | chip->model.misc_flags = OXYGEN_MISC_MIDI; | ||
401 | chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; | ||
402 | } | ||
403 | return 0; | ||
404 | } | ||
405 | |||
344 | static int __devinit generic_oxygen_probe(struct pci_dev *pci, | 406 | static int __devinit generic_oxygen_probe(struct pci_dev *pci, |
345 | const struct pci_device_id *pci_id) | 407 | const struct pci_device_id *pci_id) |
346 | { | 408 | { |
@@ -353,8 +415,8 @@ static int __devinit generic_oxygen_probe(struct pci_dev *pci, | |||
353 | ++dev; | 415 | ++dev; |
354 | return -ENOENT; | 416 | return -ENOENT; |
355 | } | 417 | } |
356 | err = oxygen_pci_probe(pci, index[dev], id[dev], | 418 | err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE, |
357 | &model_generic, pci_id->driver_data); | 419 | oxygen_ids, get_oxygen_model); |
358 | if (err >= 0) | 420 | if (err >= 0) |
359 | ++dev; | 421 | ++dev; |
360 | return err; | 422 | return err; |
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 19107c6307e5..bd615dbffadb 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
@@ -18,6 +18,8 @@ | |||
18 | 18 | ||
19 | #define OXYGEN_IO_SIZE 0x100 | 19 | #define OXYGEN_IO_SIZE 0x100 |
20 | 20 | ||
21 | #define OXYGEN_EEPROM_ID 0x434d /* "CM" */ | ||
22 | |||
21 | /* model-specific configuration of outputs/inputs */ | 23 | /* model-specific configuration of outputs/inputs */ |
22 | #define PLAYBACK_0_TO_I2S 0x0001 | 24 | #define PLAYBACK_0_TO_I2S 0x0001 |
23 | /* PLAYBACK_0_TO_AC97_0 not implemented */ | 25 | /* PLAYBACK_0_TO_AC97_0 not implemented */ |
@@ -49,7 +51,13 @@ enum { | |||
49 | .subvendor = sv, \ | 51 | .subvendor = sv, \ |
50 | .subdevice = sd | 52 | .subdevice = sd |
51 | 53 | ||
54 | #define BROKEN_EEPROM_DRIVER_DATA ((unsigned long)-1) | ||
55 | #define OXYGEN_PCI_SUBID_BROKEN_EEPROM \ | ||
56 | OXYGEN_PCI_SUBID(PCI_VENDOR_ID_CMEDIA, 0x8788), \ | ||
57 | .driver_data = BROKEN_EEPROM_DRIVER_DATA | ||
58 | |||
52 | struct pci_dev; | 59 | struct pci_dev; |
60 | struct pci_device_id; | ||
53 | struct snd_card; | 61 | struct snd_card; |
54 | struct snd_pcm_substream; | 62 | struct snd_pcm_substream; |
55 | struct snd_pcm_hardware; | 63 | struct snd_pcm_hardware; |
@@ -62,8 +70,6 @@ struct oxygen_model { | |||
62 | const char *shortname; | 70 | const char *shortname; |
63 | const char *longname; | 71 | const char *longname; |
64 | const char *chip; | 72 | const char *chip; |
65 | struct module *owner; | ||
66 | int (*probe)(struct oxygen *chip, unsigned long driver_data); | ||
67 | void (*init)(struct oxygen *chip); | 73 | void (*init)(struct oxygen *chip); |
68 | int (*control_filter)(struct snd_kcontrol_new *template); | 74 | int (*control_filter)(struct snd_kcontrol_new *template); |
69 | int (*mixer_init)(struct oxygen *chip); | 75 | int (*mixer_init)(struct oxygen *chip); |
@@ -83,6 +89,7 @@ struct oxygen_model { | |||
83 | void (*ac97_switch)(struct oxygen *chip, | 89 | void (*ac97_switch)(struct oxygen *chip, |
84 | unsigned int reg, unsigned int mute); | 90 | unsigned int reg, unsigned int mute); |
85 | const unsigned int *dac_tlv; | 91 | const unsigned int *dac_tlv; |
92 | unsigned long private_data; | ||
86 | size_t model_data_size; | 93 | size_t model_data_size; |
87 | unsigned int device_config; | 94 | unsigned int device_config; |
88 | u8 dac_channels; | 95 | u8 dac_channels; |
@@ -134,8 +141,12 @@ struct oxygen { | |||
134 | /* oxygen_lib.c */ | 141 | /* oxygen_lib.c */ |
135 | 142 | ||
136 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | 143 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, |
137 | const struct oxygen_model *model, | 144 | struct module *owner, |
138 | unsigned long driver_data); | 145 | const struct pci_device_id *ids, |
146 | int (*get_model)(struct oxygen *chip, | ||
147 | const struct pci_device_id *id | ||
148 | ) | ||
149 | ); | ||
139 | void oxygen_pci_remove(struct pci_dev *pci); | 150 | void oxygen_pci_remove(struct pci_dev *pci); |
140 | #ifdef CONFIG_PM | 151 | #ifdef CONFIG_PM |
141 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); | 152 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); |
@@ -180,6 +191,9 @@ void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data); | |||
180 | void oxygen_reset_uart(struct oxygen *chip); | 191 | void oxygen_reset_uart(struct oxygen *chip); |
181 | void oxygen_write_uart(struct oxygen *chip, u8 data); | 192 | void oxygen_write_uart(struct oxygen *chip, u8 data); |
182 | 193 | ||
194 | u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index); | ||
195 | void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value); | ||
196 | |||
183 | static inline void oxygen_set_bits8(struct oxygen *chip, | 197 | static inline void oxygen_set_bits8(struct oxygen *chip, |
184 | unsigned int reg, u8 value) | 198 | unsigned int reg, u8 value) |
185 | { | 199 | { |
diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c index 3126c4b403dd..c1eb923f2ac9 100644 --- a/sound/pci/oxygen/oxygen_io.c +++ b/sound/pci/oxygen/oxygen_io.c | |||
@@ -254,3 +254,34 @@ void oxygen_write_uart(struct oxygen *chip, u8 data) | |||
254 | _write_uart(chip, 0, data); | 254 | _write_uart(chip, 0, data); |
255 | } | 255 | } |
256 | EXPORT_SYMBOL(oxygen_write_uart); | 256 | EXPORT_SYMBOL(oxygen_write_uart); |
257 | |||
258 | u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index) | ||
259 | { | ||
260 | unsigned int timeout; | ||
261 | |||
262 | oxygen_write8(chip, OXYGEN_EEPROM_CONTROL, | ||
263 | index | OXYGEN_EEPROM_DIR_READ); | ||
264 | for (timeout = 0; timeout < 100; ++timeout) { | ||
265 | udelay(1); | ||
266 | if (!(oxygen_read8(chip, OXYGEN_EEPROM_STATUS) | ||
267 | & OXYGEN_EEPROM_BUSY)) | ||
268 | break; | ||
269 | } | ||
270 | return oxygen_read16(chip, OXYGEN_EEPROM_DATA); | ||
271 | } | ||
272 | |||
273 | void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value) | ||
274 | { | ||
275 | unsigned int timeout; | ||
276 | |||
277 | oxygen_write16(chip, OXYGEN_EEPROM_DATA, value); | ||
278 | oxygen_write8(chip, OXYGEN_EEPROM_CONTROL, | ||
279 | index | OXYGEN_EEPROM_DIR_WRITE); | ||
280 | for (timeout = 0; timeout < 10; ++timeout) { | ||
281 | msleep(1); | ||
282 | if (!(oxygen_read8(chip, OXYGEN_EEPROM_STATUS) | ||
283 | & OXYGEN_EEPROM_BUSY)) | ||
284 | return; | ||
285 | } | ||
286 | snd_printk(KERN_ERR "EEPROM write timeout\n"); | ||
287 | } | ||
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 9c81e0b05113..312251d39696 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
@@ -34,6 +34,7 @@ MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); | |||
34 | MODULE_DESCRIPTION("C-Media CMI8788 helper library"); | 34 | MODULE_DESCRIPTION("C-Media CMI8788 helper library"); |
35 | MODULE_LICENSE("GPL v2"); | 35 | MODULE_LICENSE("GPL v2"); |
36 | 36 | ||
37 | #define DRIVER "oxygen" | ||
37 | 38 | ||
38 | static inline int oxygen_uart_input_ready(struct oxygen *chip) | 39 | static inline int oxygen_uart_input_ready(struct oxygen *chip) |
39 | { | 40 | { |
@@ -243,6 +244,62 @@ static void oxygen_proc_init(struct oxygen *chip) | |||
243 | #define oxygen_proc_init(chip) | 244 | #define oxygen_proc_init(chip) |
244 | #endif | 245 | #endif |
245 | 246 | ||
247 | static const struct pci_device_id * | ||
248 | oxygen_search_pci_id(struct oxygen *chip, const struct pci_device_id ids[]) | ||
249 | { | ||
250 | u16 subdevice; | ||
251 | |||
252 | /* | ||
253 | * Make sure the EEPROM pins are available, i.e., not used for SPI. | ||
254 | * (This function is called before we initialize or use SPI.) | ||
255 | */ | ||
256 | oxygen_clear_bits8(chip, OXYGEN_FUNCTION, | ||
257 | OXYGEN_FUNCTION_ENABLE_SPI_4_5); | ||
258 | /* | ||
259 | * Read the subsystem device ID directly from the EEPROM, because the | ||
260 | * chip didn't if the first EEPROM word was overwritten. | ||
261 | */ | ||
262 | subdevice = oxygen_read_eeprom(chip, 2); | ||
263 | /* | ||
264 | * We use only the subsystem device ID for searching because it is | ||
265 | * unique even without the subsystem vendor ID, which may have been | ||
266 | * overwritten in the EEPROM. | ||
267 | */ | ||
268 | for (; ids->vendor; ++ids) | ||
269 | if (ids->subdevice == subdevice && | ||
270 | ids->driver_data != BROKEN_EEPROM_DRIVER_DATA) | ||
271 | return ids; | ||
272 | return NULL; | ||
273 | } | ||
274 | |||
275 | static void oxygen_restore_eeprom(struct oxygen *chip, | ||
276 | const struct pci_device_id *id) | ||
277 | { | ||
278 | if (oxygen_read_eeprom(chip, 0) != OXYGEN_EEPROM_ID) { | ||
279 | /* | ||
280 | * This function gets called only when a known card model has | ||
281 | * been detected, i.e., we know there is a valid subsystem | ||
282 | * product ID at index 2 in the EEPROM. Therefore, we have | ||
283 | * been able to deduce the correct subsystem vendor ID, and | ||
284 | * this is enough information to restore the original EEPROM | ||
285 | * contents. | ||
286 | */ | ||
287 | oxygen_write_eeprom(chip, 1, id->subvendor); | ||
288 | oxygen_write_eeprom(chip, 0, OXYGEN_EEPROM_ID); | ||
289 | |||
290 | oxygen_set_bits8(chip, OXYGEN_MISC, | ||
291 | OXYGEN_MISC_WRITE_PCI_SUBID); | ||
292 | pci_write_config_word(chip->pci, PCI_SUBSYSTEM_VENDOR_ID, | ||
293 | id->subvendor); | ||
294 | pci_write_config_word(chip->pci, PCI_SUBSYSTEM_ID, | ||
295 | id->subdevice); | ||
296 | oxygen_clear_bits8(chip, OXYGEN_MISC, | ||
297 | OXYGEN_MISC_WRITE_PCI_SUBID); | ||
298 | |||
299 | snd_printk(KERN_INFO "EEPROM ID restored\n"); | ||
300 | } | ||
301 | } | ||
302 | |||
246 | static void oxygen_init(struct oxygen *chip) | 303 | static void oxygen_init(struct oxygen *chip) |
247 | { | 304 | { |
248 | unsigned int i; | 305 | unsigned int i; |
@@ -446,21 +503,26 @@ static void oxygen_card_free(struct snd_card *card) | |||
446 | free_irq(chip->irq, chip); | 503 | free_irq(chip->irq, chip); |
447 | flush_scheduled_work(); | 504 | flush_scheduled_work(); |
448 | chip->model.cleanup(chip); | 505 | chip->model.cleanup(chip); |
506 | kfree(chip->model_data); | ||
449 | mutex_destroy(&chip->mutex); | 507 | mutex_destroy(&chip->mutex); |
450 | pci_release_regions(chip->pci); | 508 | pci_release_regions(chip->pci); |
451 | pci_disable_device(chip->pci); | 509 | pci_disable_device(chip->pci); |
452 | } | 510 | } |
453 | 511 | ||
454 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | 512 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, |
455 | const struct oxygen_model *model, | 513 | struct module *owner, |
456 | unsigned long driver_data) | 514 | const struct pci_device_id *ids, |
515 | int (*get_model)(struct oxygen *chip, | ||
516 | const struct pci_device_id *id | ||
517 | ) | ||
518 | ) | ||
457 | { | 519 | { |
458 | struct snd_card *card; | 520 | struct snd_card *card; |
459 | struct oxygen *chip; | 521 | struct oxygen *chip; |
522 | const struct pci_device_id *pci_id; | ||
460 | int err; | 523 | int err; |
461 | 524 | ||
462 | err = snd_card_create(index, id, model->owner, | 525 | err = snd_card_create(index, id, owner, sizeof(*chip), &card); |
463 | sizeof(*chip) + model->model_data_size, &card); | ||
464 | if (err < 0) | 526 | if (err < 0) |
465 | return err; | 527 | return err; |
466 | 528 | ||
@@ -468,8 +530,6 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
468 | chip->card = card; | 530 | chip->card = card; |
469 | chip->pci = pci; | 531 | chip->pci = pci; |
470 | chip->irq = -1; | 532 | chip->irq = -1; |
471 | chip->model = *model; | ||
472 | chip->model_data = chip + 1; | ||
473 | spin_lock_init(&chip->reg_lock); | 533 | spin_lock_init(&chip->reg_lock); |
474 | mutex_init(&chip->mutex); | 534 | mutex_init(&chip->mutex); |
475 | INIT_WORK(&chip->spdif_input_bits_work, | 535 | INIT_WORK(&chip->spdif_input_bits_work, |
@@ -481,7 +541,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
481 | if (err < 0) | 541 | if (err < 0) |
482 | goto err_card; | 542 | goto err_card; |
483 | 543 | ||
484 | err = pci_request_regions(pci, model->chip); | 544 | err = pci_request_regions(pci, DRIVER); |
485 | if (err < 0) { | 545 | if (err < 0) { |
486 | snd_printk(KERN_ERR "cannot reserve PCI resources\n"); | 546 | snd_printk(KERN_ERR "cannot reserve PCI resources\n"); |
487 | goto err_pci_enable; | 547 | goto err_pci_enable; |
@@ -495,20 +555,34 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
495 | } | 555 | } |
496 | chip->addr = pci_resource_start(pci, 0); | 556 | chip->addr = pci_resource_start(pci, 0); |
497 | 557 | ||
558 | pci_id = oxygen_search_pci_id(chip, ids); | ||
559 | if (!pci_id) { | ||
560 | err = -ENODEV; | ||
561 | goto err_pci_regions; | ||
562 | } | ||
563 | oxygen_restore_eeprom(chip, pci_id); | ||
564 | err = get_model(chip, pci_id); | ||
565 | if (err < 0) | ||
566 | goto err_pci_regions; | ||
567 | |||
568 | if (chip->model.model_data_size) { | ||
569 | chip->model_data = kzalloc(chip->model.model_data_size, | ||
570 | GFP_KERNEL); | ||
571 | if (!chip->model_data) { | ||
572 | err = -ENOMEM; | ||
573 | goto err_pci_regions; | ||
574 | } | ||
575 | } | ||
576 | |||
498 | pci_set_master(pci); | 577 | pci_set_master(pci); |
499 | snd_card_set_dev(card, &pci->dev); | 578 | snd_card_set_dev(card, &pci->dev); |
500 | card->private_free = oxygen_card_free; | 579 | card->private_free = oxygen_card_free; |
501 | 580 | ||
502 | if (chip->model.probe) { | ||
503 | err = chip->model.probe(chip, driver_data); | ||
504 | if (err < 0) | ||
505 | goto err_card; | ||
506 | } | ||
507 | oxygen_init(chip); | 581 | oxygen_init(chip); |
508 | chip->model.init(chip); | 582 | chip->model.init(chip); |
509 | 583 | ||
510 | err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED, | 584 | err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED, |
511 | chip->model.chip, chip); | 585 | DRIVER, chip); |
512 | if (err < 0) { | 586 | if (err < 0) { |
513 | snd_printk(KERN_ERR "cannot grab interrupt %d\n", pci->irq); | 587 | snd_printk(KERN_ERR "cannot grab interrupt %d\n", pci->irq); |
514 | goto err_card; | 588 | goto err_card; |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 98c6a8c65d81..bc5ce11c8b14 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -112,6 +112,34 @@ | |||
112 | * CS4362A: AD0 <- 0 | 112 | * CS4362A: AD0 <- 0 |
113 | */ | 113 | */ |
114 | 114 | ||
115 | /* | ||
116 | * Xonar Essence STX | ||
117 | * ----------------- | ||
118 | * | ||
119 | * CMI8788: | ||
120 | * | ||
121 | * I²C <-> PCM1792A | ||
122 | * | ||
123 | * GPI 0 <- external power present | ||
124 | * | ||
125 | * GPIO 0 -> enable output to speakers | ||
126 | * GPIO 1 -> route HP to front panel (0) or rear jack (1) | ||
127 | * GPIO 2 -> M0 of CS5381 | ||
128 | * GPIO 3 -> M1 of CS5381 | ||
129 | * GPIO 7 -> route output to speaker jacks (0) or HP (1) | ||
130 | * GPIO 8 -> route input jack to line-in (0) or mic-in (1) | ||
131 | * | ||
132 | * PCM1792A: | ||
133 | * | ||
134 | * AD0 <- 0 | ||
135 | * | ||
136 | * H6 daughterboard | ||
137 | * ---------------- | ||
138 | * | ||
139 | * GPIO 4 <- 0 | ||
140 | * GPIO 5 <- 0 | ||
141 | */ | ||
142 | |||
115 | #include <linux/pci.h> | 143 | #include <linux/pci.h> |
116 | #include <linux/delay.h> | 144 | #include <linux/delay.h> |
117 | #include <linux/mutex.h> | 145 | #include <linux/mutex.h> |
@@ -152,6 +180,7 @@ enum { | |||
152 | MODEL_DX, | 180 | MODEL_DX, |
153 | MODEL_HDAV, /* without daughterboard */ | 181 | MODEL_HDAV, /* without daughterboard */ |
154 | MODEL_HDAV_H6, /* with H6 daughterboard */ | 182 | MODEL_HDAV_H6, /* with H6 daughterboard */ |
183 | MODEL_STX, | ||
155 | }; | 184 | }; |
156 | 185 | ||
157 | static struct pci_device_id xonar_ids[] __devinitdata = { | 186 | static struct pci_device_id xonar_ids[] __devinitdata = { |
@@ -160,6 +189,8 @@ static struct pci_device_id xonar_ids[] __devinitdata = { | |||
160 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, | 189 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, |
161 | { OXYGEN_PCI_SUBID(0x1043, 0x8314), .driver_data = MODEL_HDAV }, | 190 | { OXYGEN_PCI_SUBID(0x1043, 0x8314), .driver_data = MODEL_HDAV }, |
162 | { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, | 191 | { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, |
192 | { OXYGEN_PCI_SUBID(0x1043, 0x835c), .driver_data = MODEL_STX }, | ||
193 | { OXYGEN_PCI_SUBID_BROKEN_EEPROM }, | ||
163 | { } | 194 | { } |
164 | }; | 195 | }; |
165 | MODULE_DEVICE_TABLE(pci, xonar_ids); | 196 | MODULE_DEVICE_TABLE(pci, xonar_ids); |
@@ -183,12 +214,14 @@ MODULE_DEVICE_TABLE(pci, xonar_ids); | |||
183 | #define GPIO_HDAV_DB_H6 0x0000 | 214 | #define GPIO_HDAV_DB_H6 0x0000 |
184 | #define GPIO_HDAV_DB_XX 0x0020 | 215 | #define GPIO_HDAV_DB_XX 0x0020 |
185 | 216 | ||
217 | #define GPIO_ST_HP_REAR 0x0002 | ||
218 | #define GPIO_ST_HP 0x0080 | ||
219 | |||
186 | #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ADx=i, /W=0 */ | 220 | #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ADx=i, /W=0 */ |
187 | #define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ | 221 | #define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ |
188 | #define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ | 222 | #define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ |
189 | 223 | ||
190 | struct xonar_data { | 224 | struct xonar_data { |
191 | unsigned int model; | ||
192 | unsigned int anti_pop_delay; | 225 | unsigned int anti_pop_delay; |
193 | unsigned int dacs; | 226 | unsigned int dacs; |
194 | u16 output_enable_bit; | 227 | u16 output_enable_bit; |
@@ -334,15 +367,9 @@ static void xonar_d2_init(struct oxygen *chip) | |||
334 | struct xonar_data *data = chip->model_data; | 367 | struct xonar_data *data = chip->model_data; |
335 | 368 | ||
336 | data->anti_pop_delay = 300; | 369 | data->anti_pop_delay = 300; |
370 | data->dacs = 4; | ||
337 | data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; | 371 | data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; |
338 | data->pcm1796_oversampling = PCM1796_OS_64; | 372 | data->pcm1796_oversampling = PCM1796_OS_64; |
339 | if (data->model == MODEL_D2X) { | ||
340 | data->ext_power_reg = OXYGEN_GPIO_DATA; | ||
341 | data->ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; | ||
342 | data->ext_power_bit = GPIO_D2X_EXT_POWER; | ||
343 | oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, | ||
344 | GPIO_D2X_EXT_POWER); | ||
345 | } | ||
346 | 373 | ||
347 | pcm1796_init(chip); | 374 | pcm1796_init(chip); |
348 | 375 | ||
@@ -355,6 +382,18 @@ static void xonar_d2_init(struct oxygen *chip) | |||
355 | snd_component_add(chip->card, "CS5381"); | 382 | snd_component_add(chip->card, "CS5381"); |
356 | } | 383 | } |
357 | 384 | ||
385 | static void xonar_d2x_init(struct oxygen *chip) | ||
386 | { | ||
387 | struct xonar_data *data = chip->model_data; | ||
388 | |||
389 | data->ext_power_reg = OXYGEN_GPIO_DATA; | ||
390 | data->ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; | ||
391 | data->ext_power_bit = GPIO_D2X_EXT_POWER; | ||
392 | oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER); | ||
393 | |||
394 | xonar_d2_init(chip); | ||
395 | } | ||
396 | |||
358 | static void update_cs4362a_volumes(struct oxygen *chip) | 397 | static void update_cs4362a_volumes(struct oxygen *chip) |
359 | { | 398 | { |
360 | u8 mute; | 399 | u8 mute; |
@@ -422,11 +461,6 @@ static void xonar_d1_init(struct oxygen *chip) | |||
422 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; | 461 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; |
423 | data->cs4362a_fm = CS4362A_FM_SINGLE | | 462 | data->cs4362a_fm = CS4362A_FM_SINGLE | |
424 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | 463 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; |
425 | if (data->model == MODEL_DX) { | ||
426 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
427 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
428 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
429 | } | ||
430 | 464 | ||
431 | oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, | 465 | oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, |
432 | OXYGEN_2WIRE_LENGTH_8 | | 466 | OXYGEN_2WIRE_LENGTH_8 | |
@@ -447,6 +481,17 @@ static void xonar_d1_init(struct oxygen *chip) | |||
447 | snd_component_add(chip->card, "CS5361"); | 481 | snd_component_add(chip->card, "CS5361"); |
448 | } | 482 | } |
449 | 483 | ||
484 | static void xonar_dx_init(struct oxygen *chip) | ||
485 | { | ||
486 | struct xonar_data *data = chip->model_data; | ||
487 | |||
488 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
489 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
490 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
491 | |||
492 | xonar_d1_init(chip); | ||
493 | } | ||
494 | |||
450 | static void xonar_hdav_init(struct oxygen *chip) | 495 | static void xonar_hdav_init(struct oxygen *chip) |
451 | { | 496 | { |
452 | struct xonar_data *data = chip->model_data; | 497 | struct xonar_data *data = chip->model_data; |
@@ -458,6 +503,7 @@ static void xonar_hdav_init(struct oxygen *chip) | |||
458 | OXYGEN_2WIRE_SPEED_FAST); | 503 | OXYGEN_2WIRE_SPEED_FAST); |
459 | 504 | ||
460 | data->anti_pop_delay = 100; | 505 | data->anti_pop_delay = 100; |
506 | data->dacs = chip->model.private_data == MODEL_HDAV_H6 ? 4 : 1; | ||
461 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; | 507 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; |
462 | data->ext_power_reg = OXYGEN_GPI_DATA; | 508 | data->ext_power_reg = OXYGEN_GPI_DATA; |
463 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | 509 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; |
@@ -484,6 +530,36 @@ static void xonar_hdav_init(struct oxygen *chip) | |||
484 | snd_component_add(chip->card, "CS5381"); | 530 | snd_component_add(chip->card, "CS5381"); |
485 | } | 531 | } |
486 | 532 | ||
533 | static void xonar_stx_init(struct oxygen *chip) | ||
534 | { | ||
535 | struct xonar_data *data = chip->model_data; | ||
536 | |||
537 | oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, | ||
538 | OXYGEN_2WIRE_LENGTH_8 | | ||
539 | OXYGEN_2WIRE_INTERRUPT_MASK | | ||
540 | OXYGEN_2WIRE_SPEED_FAST); | ||
541 | |||
542 | data->anti_pop_delay = 100; | ||
543 | data->dacs = 1; | ||
544 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; | ||
545 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
546 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
547 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
548 | data->pcm1796_oversampling = PCM1796_OS_64; | ||
549 | |||
550 | pcm1796_init(chip); | ||
551 | |||
552 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, | ||
553 | GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); | ||
554 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, | ||
555 | GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); | ||
556 | |||
557 | xonar_common_init(chip); | ||
558 | |||
559 | snd_component_add(chip->card, "PCM1792A"); | ||
560 | snd_component_add(chip->card, "CS5381"); | ||
561 | } | ||
562 | |||
487 | static void xonar_disable_output(struct oxygen *chip) | 563 | static void xonar_disable_output(struct oxygen *chip) |
488 | { | 564 | { |
489 | struct xonar_data *data = chip->model_data; | 565 | struct xonar_data *data = chip->model_data; |
@@ -511,6 +587,11 @@ static void xonar_hdav_cleanup(struct oxygen *chip) | |||
511 | xonar_disable_output(chip); | 587 | xonar_disable_output(chip); |
512 | } | 588 | } |
513 | 589 | ||
590 | static void xonar_st_cleanup(struct oxygen *chip) | ||
591 | { | ||
592 | xonar_disable_output(chip); | ||
593 | } | ||
594 | |||
514 | static void xonar_d2_suspend(struct oxygen *chip) | 595 | static void xonar_d2_suspend(struct oxygen *chip) |
515 | { | 596 | { |
516 | xonar_d2_cleanup(chip); | 597 | xonar_d2_cleanup(chip); |
@@ -527,6 +608,11 @@ static void xonar_hdav_suspend(struct oxygen *chip) | |||
527 | msleep(2); | 608 | msleep(2); |
528 | } | 609 | } |
529 | 610 | ||
611 | static void xonar_st_suspend(struct oxygen *chip) | ||
612 | { | ||
613 | xonar_st_cleanup(chip); | ||
614 | } | ||
615 | |||
530 | static void xonar_d2_resume(struct oxygen *chip) | 616 | static void xonar_d2_resume(struct oxygen *chip) |
531 | { | 617 | { |
532 | pcm1796_init(chip); | 618 | pcm1796_init(chip); |
@@ -554,6 +640,12 @@ static void xonar_hdav_resume(struct oxygen *chip) | |||
554 | xonar_enable_output(chip); | 640 | xonar_enable_output(chip); |
555 | } | 641 | } |
556 | 642 | ||
643 | static void xonar_st_resume(struct oxygen *chip) | ||
644 | { | ||
645 | pcm1796_init(chip); | ||
646 | xonar_enable_output(chip); | ||
647 | } | ||
648 | |||
557 | static void xonar_hdav_pcm_hardware_filter(unsigned int channel, | 649 | static void xonar_hdav_pcm_hardware_filter(unsigned int channel, |
558 | struct snd_pcm_hardware *hardware) | 650 | struct snd_pcm_hardware *hardware) |
559 | { | 651 | { |
@@ -676,7 +768,7 @@ static void xonar_hdav_uart_input(struct oxygen *chip) | |||
676 | if (chip->uart_input_count >= 2 && | 768 | if (chip->uart_input_count >= 2 && |
677 | chip->uart_input[chip->uart_input_count - 2] == 'O' && | 769 | chip->uart_input[chip->uart_input_count - 2] == 'O' && |
678 | chip->uart_input[chip->uart_input_count - 1] == 'K') { | 770 | chip->uart_input[chip->uart_input_count - 1] == 'K') { |
679 | printk(KERN_DEBUG "message from Xonar HDAV HDMI chip received:"); | 771 | printk(KERN_DEBUG "message from Xonar HDAV HDMI chip received:\n"); |
680 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, | 772 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, |
681 | chip->uart_input, chip->uart_input_count); | 773 | chip->uart_input, chip->uart_input_count); |
682 | chip->uart_input_count = 0; | 774 | chip->uart_input_count = 0; |
@@ -733,6 +825,72 @@ static const struct snd_kcontrol_new front_panel_switch = { | |||
733 | .private_value = GPIO_DX_FRONT_PANEL, | 825 | .private_value = GPIO_DX_FRONT_PANEL, |
734 | }; | 826 | }; |
735 | 827 | ||
828 | static int st_output_switch_info(struct snd_kcontrol *ctl, | ||
829 | struct snd_ctl_elem_info *info) | ||
830 | { | ||
831 | static const char *const names[3] = { | ||
832 | "Speakers", "Headphones", "FP Headphones" | ||
833 | }; | ||
834 | |||
835 | info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | ||
836 | info->count = 1; | ||
837 | info->value.enumerated.items = 3; | ||
838 | if (info->value.enumerated.item >= 3) | ||
839 | info->value.enumerated.item = 2; | ||
840 | strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); | ||
841 | return 0; | ||
842 | } | ||
843 | |||
844 | static int st_output_switch_get(struct snd_kcontrol *ctl, | ||
845 | struct snd_ctl_elem_value *value) | ||
846 | { | ||
847 | struct oxygen *chip = ctl->private_data; | ||
848 | u16 gpio; | ||
849 | |||
850 | gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA); | ||
851 | if (!(gpio & GPIO_ST_HP)) | ||
852 | value->value.enumerated.item[0] = 0; | ||
853 | else if (gpio & GPIO_ST_HP_REAR) | ||
854 | value->value.enumerated.item[0] = 1; | ||
855 | else | ||
856 | value->value.enumerated.item[0] = 2; | ||
857 | return 0; | ||
858 | } | ||
859 | |||
860 | |||
861 | static int st_output_switch_put(struct snd_kcontrol *ctl, | ||
862 | struct snd_ctl_elem_value *value) | ||
863 | { | ||
864 | struct oxygen *chip = ctl->private_data; | ||
865 | u16 gpio_old, gpio; | ||
866 | |||
867 | mutex_lock(&chip->mutex); | ||
868 | gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA); | ||
869 | gpio = gpio_old; | ||
870 | switch (value->value.enumerated.item[0]) { | ||
871 | case 0: | ||
872 | gpio &= ~(GPIO_ST_HP | GPIO_ST_HP_REAR); | ||
873 | break; | ||
874 | case 1: | ||
875 | gpio |= GPIO_ST_HP | GPIO_ST_HP_REAR; | ||
876 | break; | ||
877 | case 2: | ||
878 | gpio = (gpio | GPIO_ST_HP) & ~GPIO_ST_HP_REAR; | ||
879 | break; | ||
880 | } | ||
881 | oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio); | ||
882 | mutex_unlock(&chip->mutex); | ||
883 | return gpio != gpio_old; | ||
884 | } | ||
885 | |||
886 | static const struct snd_kcontrol_new st_output_switch = { | ||
887 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
888 | .name = "Analog Output", | ||
889 | .info = st_output_switch_info, | ||
890 | .get = st_output_switch_get, | ||
891 | .put = st_output_switch_put, | ||
892 | }; | ||
893 | |||
736 | static void xonar_line_mic_ac97_switch(struct oxygen *chip, | 894 | static void xonar_line_mic_ac97_switch(struct oxygen *chip, |
737 | unsigned int reg, unsigned int mute) | 895 | unsigned int reg, unsigned int mute) |
738 | { | 896 | { |
@@ -745,8 +903,8 @@ static void xonar_line_mic_ac97_switch(struct oxygen *chip, | |||
745 | } | 903 | } |
746 | } | 904 | } |
747 | 905 | ||
748 | static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -12000, 50, 0); | 906 | static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0); |
749 | static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0); | 907 | static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -6000, 100, 0); |
750 | 908 | ||
751 | static int xonar_d2_control_filter(struct snd_kcontrol_new *template) | 909 | static int xonar_d2_control_filter(struct snd_kcontrol_new *template) |
752 | { | 910 | { |
@@ -763,6 +921,15 @@ static int xonar_d1_control_filter(struct snd_kcontrol_new *template) | |||
763 | return 0; | 921 | return 0; |
764 | } | 922 | } |
765 | 923 | ||
924 | static int xonar_st_control_filter(struct snd_kcontrol_new *template) | ||
925 | { | ||
926 | if (!strncmp(template->name, "CD Capture ", 11)) | ||
927 | return 1; /* no CD input */ | ||
928 | if (!strcmp(template->name, "Stereo Upmixing")) | ||
929 | return 1; /* stereo only - we don't need upmixing */ | ||
930 | return 0; | ||
931 | } | ||
932 | |||
766 | static int xonar_d2_mixer_init(struct oxygen *chip) | 933 | static int xonar_d2_mixer_init(struct oxygen *chip) |
767 | { | 934 | { |
768 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); | 935 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); |
@@ -773,51 +940,14 @@ static int xonar_d1_mixer_init(struct oxygen *chip) | |||
773 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); | 940 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); |
774 | } | 941 | } |
775 | 942 | ||
776 | static int xonar_model_probe(struct oxygen *chip, unsigned long driver_data) | 943 | static int xonar_st_mixer_init(struct oxygen *chip) |
777 | { | 944 | { |
778 | static const char *const names[] = { | 945 | return snd_ctl_add(chip->card, snd_ctl_new1(&st_output_switch, chip)); |
779 | [MODEL_D1] = "Xonar D1", | ||
780 | [MODEL_DX] = "Xonar DX", | ||
781 | [MODEL_D2] = "Xonar D2", | ||
782 | [MODEL_D2X] = "Xonar D2X", | ||
783 | [MODEL_HDAV] = "Xonar HDAV1.3", | ||
784 | [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6", | ||
785 | }; | ||
786 | static const u8 dacs[] = { | ||
787 | [MODEL_D1] = 2, | ||
788 | [MODEL_DX] = 2, | ||
789 | [MODEL_D2] = 4, | ||
790 | [MODEL_D2X] = 4, | ||
791 | [MODEL_HDAV] = 1, | ||
792 | [MODEL_HDAV_H6] = 4, | ||
793 | }; | ||
794 | struct xonar_data *data = chip->model_data; | ||
795 | |||
796 | data->model = driver_data; | ||
797 | if (data->model == MODEL_HDAV) { | ||
798 | oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, | ||
799 | GPIO_HDAV_DB_MASK); | ||
800 | switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & | ||
801 | GPIO_HDAV_DB_MASK) { | ||
802 | case GPIO_HDAV_DB_H6: | ||
803 | data->model = MODEL_HDAV_H6; | ||
804 | break; | ||
805 | case GPIO_HDAV_DB_XX: | ||
806 | snd_printk(KERN_ERR "unknown daughterboard\n"); | ||
807 | return -ENODEV; | ||
808 | } | ||
809 | } | ||
810 | |||
811 | data->dacs = dacs[data->model]; | ||
812 | chip->model.shortname = names[data->model]; | ||
813 | return 0; | ||
814 | } | 946 | } |
815 | 947 | ||
816 | static const struct oxygen_model model_xonar_d2 = { | 948 | static const struct oxygen_model model_xonar_d2 = { |
817 | .longname = "Asus Virtuoso 200", | 949 | .longname = "Asus Virtuoso 200", |
818 | .chip = "AV200", | 950 | .chip = "AV200", |
819 | .owner = THIS_MODULE, | ||
820 | .probe = xonar_model_probe, | ||
821 | .init = xonar_d2_init, | 951 | .init = xonar_d2_init, |
822 | .control_filter = xonar_d2_control_filter, | 952 | .control_filter = xonar_d2_control_filter, |
823 | .mixer_init = xonar_d2_mixer_init, | 953 | .mixer_init = xonar_d2_mixer_init, |
@@ -837,8 +967,8 @@ static const struct oxygen_model model_xonar_d2 = { | |||
837 | MIDI_OUTPUT | | 967 | MIDI_OUTPUT | |
838 | MIDI_INPUT, | 968 | MIDI_INPUT, |
839 | .dac_channels = 8, | 969 | .dac_channels = 8, |
840 | .dac_volume_min = 0x0f, | 970 | .dac_volume_min = 255 - 2*60, |
841 | .dac_volume_max = 0xff, | 971 | .dac_volume_max = 255, |
842 | .misc_flags = OXYGEN_MISC_MIDI, | 972 | .misc_flags = OXYGEN_MISC_MIDI, |
843 | .function_flags = OXYGEN_FUNCTION_SPI | | 973 | .function_flags = OXYGEN_FUNCTION_SPI | |
844 | OXYGEN_FUNCTION_ENABLE_SPI_4_5, | 974 | OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
@@ -849,8 +979,6 @@ static const struct oxygen_model model_xonar_d2 = { | |||
849 | static const struct oxygen_model model_xonar_d1 = { | 979 | static const struct oxygen_model model_xonar_d1 = { |
850 | .longname = "Asus Virtuoso 100", | 980 | .longname = "Asus Virtuoso 100", |
851 | .chip = "AV200", | 981 | .chip = "AV200", |
852 | .owner = THIS_MODULE, | ||
853 | .probe = xonar_model_probe, | ||
854 | .init = xonar_d1_init, | 982 | .init = xonar_d1_init, |
855 | .control_filter = xonar_d1_control_filter, | 983 | .control_filter = xonar_d1_control_filter, |
856 | .mixer_init = xonar_d1_mixer_init, | 984 | .mixer_init = xonar_d1_mixer_init, |
@@ -868,7 +996,7 @@ static const struct oxygen_model model_xonar_d1 = { | |||
868 | PLAYBACK_1_TO_SPDIF | | 996 | PLAYBACK_1_TO_SPDIF | |
869 | CAPTURE_0_FROM_I2S_2, | 997 | CAPTURE_0_FROM_I2S_2, |
870 | .dac_channels = 8, | 998 | .dac_channels = 8, |
871 | .dac_volume_min = 0, | 999 | .dac_volume_min = 127 - 60, |
872 | .dac_volume_max = 127, | 1000 | .dac_volume_max = 127, |
873 | .function_flags = OXYGEN_FUNCTION_2WIRE, | 1001 | .function_flags = OXYGEN_FUNCTION_2WIRE, |
874 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 1002 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
@@ -878,8 +1006,6 @@ static const struct oxygen_model model_xonar_d1 = { | |||
878 | static const struct oxygen_model model_xonar_hdav = { | 1006 | static const struct oxygen_model model_xonar_hdav = { |
879 | .longname = "Asus Virtuoso 200", | 1007 | .longname = "Asus Virtuoso 200", |
880 | .chip = "AV200", | 1008 | .chip = "AV200", |
881 | .owner = THIS_MODULE, | ||
882 | .probe = xonar_model_probe, | ||
883 | .init = xonar_hdav_init, | 1009 | .init = xonar_hdav_init, |
884 | .cleanup = xonar_hdav_cleanup, | 1010 | .cleanup = xonar_hdav_cleanup, |
885 | .suspend = xonar_hdav_suspend, | 1011 | .suspend = xonar_hdav_suspend, |
@@ -897,15 +1023,43 @@ static const struct oxygen_model model_xonar_hdav = { | |||
897 | PLAYBACK_1_TO_SPDIF | | 1023 | PLAYBACK_1_TO_SPDIF | |
898 | CAPTURE_0_FROM_I2S_2, | 1024 | CAPTURE_0_FROM_I2S_2, |
899 | .dac_channels = 8, | 1025 | .dac_channels = 8, |
900 | .dac_volume_min = 0x0f, | 1026 | .dac_volume_min = 255 - 2*60, |
901 | .dac_volume_max = 0xff, | 1027 | .dac_volume_max = 255, |
1028 | .misc_flags = OXYGEN_MISC_MIDI, | ||
902 | .function_flags = OXYGEN_FUNCTION_2WIRE, | 1029 | .function_flags = OXYGEN_FUNCTION_2WIRE, |
903 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 1030 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
904 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 1031 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
905 | }; | 1032 | }; |
906 | 1033 | ||
907 | static int __devinit xonar_probe(struct pci_dev *pci, | 1034 | static const struct oxygen_model model_xonar_st = { |
908 | const struct pci_device_id *pci_id) | 1035 | .longname = "Asus Virtuoso 100", |
1036 | .chip = "AV200", | ||
1037 | .init = xonar_stx_init, | ||
1038 | .control_filter = xonar_st_control_filter, | ||
1039 | .mixer_init = xonar_st_mixer_init, | ||
1040 | .cleanup = xonar_st_cleanup, | ||
1041 | .suspend = xonar_st_suspend, | ||
1042 | .resume = xonar_st_resume, | ||
1043 | .set_dac_params = set_pcm1796_params, | ||
1044 | .set_adc_params = set_cs53x1_params, | ||
1045 | .update_dac_volume = update_pcm1796_volume, | ||
1046 | .update_dac_mute = update_pcm1796_mute, | ||
1047 | .ac97_switch = xonar_line_mic_ac97_switch, | ||
1048 | .dac_tlv = pcm1796_db_scale, | ||
1049 | .model_data_size = sizeof(struct xonar_data), | ||
1050 | .device_config = PLAYBACK_0_TO_I2S | | ||
1051 | PLAYBACK_1_TO_SPDIF | | ||
1052 | CAPTURE_0_FROM_I2S_2, | ||
1053 | .dac_channels = 2, | ||
1054 | .dac_volume_min = 255 - 2*60, | ||
1055 | .dac_volume_max = 255, | ||
1056 | .function_flags = OXYGEN_FUNCTION_2WIRE, | ||
1057 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
1058 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
1059 | }; | ||
1060 | |||
1061 | static int __devinit get_xonar_model(struct oxygen *chip, | ||
1062 | const struct pci_device_id *id) | ||
909 | { | 1063 | { |
910 | static const struct oxygen_model *const models[] = { | 1064 | static const struct oxygen_model *const models[] = { |
911 | [MODEL_D1] = &model_xonar_d1, | 1065 | [MODEL_D1] = &model_xonar_d1, |
@@ -913,7 +1067,57 @@ static int __devinit xonar_probe(struct pci_dev *pci, | |||
913 | [MODEL_D2] = &model_xonar_d2, | 1067 | [MODEL_D2] = &model_xonar_d2, |
914 | [MODEL_D2X] = &model_xonar_d2, | 1068 | [MODEL_D2X] = &model_xonar_d2, |
915 | [MODEL_HDAV] = &model_xonar_hdav, | 1069 | [MODEL_HDAV] = &model_xonar_hdav, |
1070 | [MODEL_STX] = &model_xonar_st, | ||
916 | }; | 1071 | }; |
1072 | static const char *const names[] = { | ||
1073 | [MODEL_D1] = "Xonar D1", | ||
1074 | [MODEL_DX] = "Xonar DX", | ||
1075 | [MODEL_D2] = "Xonar D2", | ||
1076 | [MODEL_D2X] = "Xonar D2X", | ||
1077 | [MODEL_HDAV] = "Xonar HDAV1.3", | ||
1078 | [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6", | ||
1079 | [MODEL_STX] = "Xonar Essence STX", | ||
1080 | }; | ||
1081 | unsigned int model = id->driver_data; | ||
1082 | |||
1083 | if (model >= ARRAY_SIZE(models) || !models[model]) | ||
1084 | return -EINVAL; | ||
1085 | chip->model = *models[model]; | ||
1086 | |||
1087 | switch (model) { | ||
1088 | case MODEL_D2X: | ||
1089 | chip->model.init = xonar_d2x_init; | ||
1090 | break; | ||
1091 | case MODEL_DX: | ||
1092 | chip->model.init = xonar_dx_init; | ||
1093 | break; | ||
1094 | case MODEL_HDAV: | ||
1095 | oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, | ||
1096 | GPIO_HDAV_DB_MASK); | ||
1097 | switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & | ||
1098 | GPIO_HDAV_DB_MASK) { | ||
1099 | case GPIO_HDAV_DB_H6: | ||
1100 | model = MODEL_HDAV_H6; | ||
1101 | break; | ||
1102 | case GPIO_HDAV_DB_XX: | ||
1103 | snd_printk(KERN_ERR "unknown daughterboard\n"); | ||
1104 | return -ENODEV; | ||
1105 | } | ||
1106 | break; | ||
1107 | case MODEL_STX: | ||
1108 | oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, | ||
1109 | GPIO_HDAV_DB_MASK); | ||
1110 | break; | ||
1111 | } | ||
1112 | |||
1113 | chip->model.shortname = names[model]; | ||
1114 | chip->model.private_data = model; | ||
1115 | return 0; | ||
1116 | } | ||
1117 | |||
1118 | static int __devinit xonar_probe(struct pci_dev *pci, | ||
1119 | const struct pci_device_id *pci_id) | ||
1120 | { | ||
917 | static int dev; | 1121 | static int dev; |
918 | int err; | 1122 | int err; |
919 | 1123 | ||
@@ -923,10 +1127,8 @@ static int __devinit xonar_probe(struct pci_dev *pci, | |||
923 | ++dev; | 1127 | ++dev; |
924 | return -ENOENT; | 1128 | return -ENOENT; |
925 | } | 1129 | } |
926 | BUG_ON(pci_id->driver_data >= ARRAY_SIZE(models)); | 1130 | err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE, |
927 | err = oxygen_pci_probe(pci, index[dev], id[dev], | 1131 | xonar_ids, get_xonar_model); |
928 | models[pci_id->driver_data], | ||
929 | pci_id->driver_data); | ||
930 | if (err >= 0) | 1132 | if (err >= 0) |
931 | ++dev; | 1133 | ++dev; |
932 | return err; | 1134 | return err; |
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 7f95459c8b1f..833e9c7b27c7 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c | |||
@@ -1334,6 +1334,40 @@ static void pcxhr_proc_sync(struct snd_info_entry *entry, | |||
1334 | snd_iprintf(buffer, "\n"); | 1334 | snd_iprintf(buffer, "\n"); |
1335 | } | 1335 | } |
1336 | 1336 | ||
1337 | static void pcxhr_proc_gpio_read(struct snd_info_entry *entry, | ||
1338 | struct snd_info_buffer *buffer) | ||
1339 | { | ||
1340 | struct snd_pcxhr *chip = entry->private_data; | ||
1341 | struct pcxhr_mgr *mgr = chip->mgr; | ||
1342 | /* commands available when embedded DSP is running */ | ||
1343 | if (mgr->dsp_loaded & (1 << PCXHR_FIRMWARE_DSP_MAIN_INDEX)) { | ||
1344 | /* gpio ports on stereo boards only available */ | ||
1345 | int value = 0; | ||
1346 | hr222_read_gpio(mgr, 1, &value); /* GPI */ | ||
1347 | snd_iprintf(buffer, "GPI: 0x%x\n", value); | ||
1348 | hr222_read_gpio(mgr, 0, &value); /* GP0 */ | ||
1349 | snd_iprintf(buffer, "GPO: 0x%x\n", value); | ||
1350 | } else | ||
1351 | snd_iprintf(buffer, "no firmware loaded\n"); | ||
1352 | snd_iprintf(buffer, "\n"); | ||
1353 | } | ||
1354 | static void pcxhr_proc_gpo_write(struct snd_info_entry *entry, | ||
1355 | struct snd_info_buffer *buffer) | ||
1356 | { | ||
1357 | struct snd_pcxhr *chip = entry->private_data; | ||
1358 | struct pcxhr_mgr *mgr = chip->mgr; | ||
1359 | char line[64]; | ||
1360 | int value; | ||
1361 | /* commands available when embedded DSP is running */ | ||
1362 | if (!(mgr->dsp_loaded & (1 << PCXHR_FIRMWARE_DSP_MAIN_INDEX))) | ||
1363 | return; | ||
1364 | while (!snd_info_get_line(buffer, line, sizeof(line))) { | ||
1365 | if (sscanf(line, "GPO: 0x%x", &value) != 1) | ||
1366 | continue; | ||
1367 | hr222_write_gpo(mgr, value); /* GP0 */ | ||
1368 | } | ||
1369 | } | ||
1370 | |||
1337 | static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip) | 1371 | static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip) |
1338 | { | 1372 | { |
1339 | struct snd_info_entry *entry; | 1373 | struct snd_info_entry *entry; |
@@ -1342,6 +1376,13 @@ static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip) | |||
1342 | snd_info_set_text_ops(entry, chip, pcxhr_proc_info); | 1376 | snd_info_set_text_ops(entry, chip, pcxhr_proc_info); |
1343 | if (! snd_card_proc_new(chip->card, "sync", &entry)) | 1377 | if (! snd_card_proc_new(chip->card, "sync", &entry)) |
1344 | snd_info_set_text_ops(entry, chip, pcxhr_proc_sync); | 1378 | snd_info_set_text_ops(entry, chip, pcxhr_proc_sync); |
1379 | /* gpio available on stereo sound cards only */ | ||
1380 | if (chip->mgr->is_hr_stereo && | ||
1381 | !snd_card_proc_new(chip->card, "gpio", &entry)) { | ||
1382 | snd_info_set_text_ops(entry, chip, pcxhr_proc_gpio_read); | ||
1383 | entry->c.text.write = pcxhr_proc_gpo_write; | ||
1384 | entry->mode |= S_IWUSR; | ||
1385 | } | ||
1345 | } | 1386 | } |
1346 | /* end of proc interface */ | 1387 | /* end of proc interface */ |
1347 | 1388 | ||
@@ -1408,7 +1449,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, | |||
1408 | pci_set_master(pci); | 1449 | pci_set_master(pci); |
1409 | 1450 | ||
1410 | /* check if we can restrict PCI DMA transfers to 32 bits */ | 1451 | /* check if we can restrict PCI DMA transfers to 32 bits */ |
1411 | if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) { | 1452 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { |
1412 | snd_printk(KERN_ERR "architecture does not support " | 1453 | snd_printk(KERN_ERR "architecture does not support " |
1413 | "32bit PCI busmaster DMA\n"); | 1454 | "32bit PCI busmaster DMA\n"); |
1414 | pci_disable_device(pci); | 1455 | pci_disable_device(pci); |
diff --git a/sound/pci/pcxhr/pcxhr.h b/sound/pci/pcxhr/pcxhr.h index 84131a916c92..bda776c49884 100644 --- a/sound/pci/pcxhr/pcxhr.h +++ b/sound/pci/pcxhr/pcxhr.h | |||
@@ -27,8 +27,8 @@ | |||
27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
28 | #include <sound/pcm.h> | 28 | #include <sound/pcm.h> |
29 | 29 | ||
30 | #define PCXHR_DRIVER_VERSION 0x000905 /* 0.9.5 */ | 30 | #define PCXHR_DRIVER_VERSION 0x000906 /* 0.9.6 */ |
31 | #define PCXHR_DRIVER_VERSION_STRING "0.9.5" /* 0.9.5 */ | 31 | #define PCXHR_DRIVER_VERSION_STRING "0.9.6" /* 0.9.6 */ |
32 | 32 | ||
33 | 33 | ||
34 | #define PCXHR_MAX_CARDS 6 | 34 | #define PCXHR_MAX_CARDS 6 |
@@ -97,12 +97,12 @@ struct pcxhr_mgr { | |||
97 | int capture_chips; | 97 | int capture_chips; |
98 | int fw_file_set; | 98 | int fw_file_set; |
99 | int firmware_num; | 99 | int firmware_num; |
100 | int is_hr_stereo:1; | 100 | unsigned int is_hr_stereo:1; |
101 | int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */ | 101 | unsigned int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */ |
102 | int board_has_analog:1; /* if 0 the board is digital only */ | 102 | unsigned int board_has_analog:1; /* if 0 the board is digital only */ |
103 | int board_has_mic:1; /* if 1 the board has microphone input */ | 103 | unsigned int board_has_mic:1; /* if 1 the board has microphone input */ |
104 | int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */ | 104 | unsigned int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */ |
105 | int mono_capture:1; /* if 1 the board does mono capture */ | 105 | unsigned int mono_capture:1; /* if 1 the board does mono capture */ |
106 | 106 | ||
107 | struct snd_dma_buffer hostport; | 107 | struct snd_dma_buffer hostport; |
108 | 108 | ||
@@ -124,6 +124,7 @@ struct pcxhr_mgr { | |||
124 | 124 | ||
125 | unsigned char xlx_cfg; /* copy of PCXHR_XLX_CFG register */ | 125 | unsigned char xlx_cfg; /* copy of PCXHR_XLX_CFG register */ |
126 | unsigned char xlx_selmic; /* copy of PCXHR_XLX_SELMIC register */ | 126 | unsigned char xlx_selmic; /* copy of PCXHR_XLX_SELMIC register */ |
127 | unsigned char dsp_reset; /* copy of PCXHR_DSP_RESET register */ | ||
127 | }; | 128 | }; |
128 | 129 | ||
129 | 130 | ||
diff --git a/sound/pci/pcxhr/pcxhr_core.h b/sound/pci/pcxhr/pcxhr_core.h index bbbd66d13a64..be0173796cdb 100644 --- a/sound/pci/pcxhr/pcxhr_core.h +++ b/sound/pci/pcxhr/pcxhr_core.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Driver for Digigram pcxhr compatible soundcards | 2 | * Driver for Digigram pcxhr compatible soundcards |
3 | * | 3 | * |
4 | * low level interface with interrupt ans message handling | 4 | * low level interface with interrupt and message handling |
5 | * | 5 | * |
6 | * Copyright (c) 2004 by Digigram <alsa@digigram.com> | 6 | * Copyright (c) 2004 by Digigram <alsa@digigram.com> |
7 | * | 7 | * |
diff --git a/sound/pci/pcxhr/pcxhr_hwdep.c b/sound/pci/pcxhr/pcxhr_hwdep.c index 592743a298b0..17cb1233a903 100644 --- a/sound/pci/pcxhr/pcxhr_hwdep.c +++ b/sound/pci/pcxhr/pcxhr_hwdep.c | |||
@@ -471,16 +471,6 @@ static int pcxhr_hwdep_dsp_load(struct snd_hwdep *hw, | |||
471 | return 0; | 471 | return 0; |
472 | } | 472 | } |
473 | 473 | ||
474 | static int pcxhr_hwdep_open(struct snd_hwdep *hw, struct file *file) | ||
475 | { | ||
476 | return 0; | ||
477 | } | ||
478 | |||
479 | static int pcxhr_hwdep_release(struct snd_hwdep *hw, struct file *file) | ||
480 | { | ||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | int pcxhr_setup_firmware(struct pcxhr_mgr *mgr) | 474 | int pcxhr_setup_firmware(struct pcxhr_mgr *mgr) |
485 | { | 475 | { |
486 | int err; | 476 | int err; |
@@ -495,8 +485,6 @@ int pcxhr_setup_firmware(struct pcxhr_mgr *mgr) | |||
495 | 485 | ||
496 | hw->iface = SNDRV_HWDEP_IFACE_PCXHR; | 486 | hw->iface = SNDRV_HWDEP_IFACE_PCXHR; |
497 | hw->private_data = mgr; | 487 | hw->private_data = mgr; |
498 | hw->ops.open = pcxhr_hwdep_open; | ||
499 | hw->ops.release = pcxhr_hwdep_release; | ||
500 | hw->ops.dsp_status = pcxhr_hwdep_dsp_status; | 488 | hw->ops.dsp_status = pcxhr_hwdep_dsp_status; |
501 | hw->ops.dsp_load = pcxhr_hwdep_dsp_load; | 489 | hw->ops.dsp_load = pcxhr_hwdep_dsp_load; |
502 | hw->exclusive = 1; | 490 | hw->exclusive = 1; |
diff --git a/sound/pci/pcxhr/pcxhr_mix22.c b/sound/pci/pcxhr/pcxhr_mix22.c index ff019126b672..1cb82c0a9cb3 100644 --- a/sound/pci/pcxhr/pcxhr_mix22.c +++ b/sound/pci/pcxhr/pcxhr_mix22.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #define PCXHR_DSP_RESET_DSP 0x01 | 53 | #define PCXHR_DSP_RESET_DSP 0x01 |
54 | #define PCXHR_DSP_RESET_MUTE 0x02 | 54 | #define PCXHR_DSP_RESET_MUTE 0x02 |
55 | #define PCXHR_DSP_RESET_CODEC 0x08 | 55 | #define PCXHR_DSP_RESET_CODEC 0x08 |
56 | #define PCXHR_DSP_RESET_GPO_OFFSET 5 | ||
57 | #define PCXHR_DSP_RESET_GPO_MASK 0x60 | ||
56 | 58 | ||
57 | /* values for PCHR_XLX_CFG register */ | 59 | /* values for PCHR_XLX_CFG register */ |
58 | #define PCXHR_CFG_SYNCDSP_MASK 0x80 | 60 | #define PCXHR_CFG_SYNCDSP_MASK 0x80 |
@@ -81,6 +83,8 @@ | |||
81 | /* values for PCHR_XLX_STATUS register - READ */ | 83 | /* values for PCHR_XLX_STATUS register - READ */ |
82 | #define PCXHR_STAT_SRC_LOCK 0x01 | 84 | #define PCXHR_STAT_SRC_LOCK 0x01 |
83 | #define PCXHR_STAT_LEVEL_IN 0x02 | 85 | #define PCXHR_STAT_LEVEL_IN 0x02 |
86 | #define PCXHR_STAT_GPI_OFFSET 2 | ||
87 | #define PCXHR_STAT_GPI_MASK 0x0C | ||
84 | #define PCXHR_STAT_MIC_CAPS 0x10 | 88 | #define PCXHR_STAT_MIC_CAPS 0x10 |
85 | /* values for PCHR_XLX_STATUS register - WRITE */ | 89 | /* values for PCHR_XLX_STATUS register - WRITE */ |
86 | #define PCXHR_STAT_FREQ_SYNC_MASK 0x01 | 90 | #define PCXHR_STAT_FREQ_SYNC_MASK 0x01 |
@@ -291,10 +295,11 @@ int hr222_sub_init(struct pcxhr_mgr *mgr) | |||
291 | PCXHR_OUTPB(mgr, PCXHR_DSP_RESET, | 295 | PCXHR_OUTPB(mgr, PCXHR_DSP_RESET, |
292 | PCXHR_DSP_RESET_DSP); | 296 | PCXHR_DSP_RESET_DSP); |
293 | msleep(5); | 297 | msleep(5); |
294 | PCXHR_OUTPB(mgr, PCXHR_DSP_RESET, | 298 | mgr->dsp_reset = PCXHR_DSP_RESET_DSP | |
295 | PCXHR_DSP_RESET_DSP | | 299 | PCXHR_DSP_RESET_MUTE | |
296 | PCXHR_DSP_RESET_MUTE | | 300 | PCXHR_DSP_RESET_CODEC; |
297 | PCXHR_DSP_RESET_CODEC); | 301 | PCXHR_OUTPB(mgr, PCXHR_DSP_RESET, mgr->dsp_reset); |
302 | /* hr222_write_gpo(mgr, 0); does the same */ | ||
298 | msleep(5); | 303 | msleep(5); |
299 | 304 | ||
300 | /* config AKM */ | 305 | /* config AKM */ |
@@ -496,6 +501,33 @@ int hr222_get_external_clock(struct pcxhr_mgr *mgr, | |||
496 | } | 501 | } |
497 | 502 | ||
498 | 503 | ||
504 | int hr222_read_gpio(struct pcxhr_mgr *mgr, int is_gpi, int *value) | ||
505 | { | ||
506 | if (is_gpi) { | ||
507 | unsigned char reg = PCXHR_INPB(mgr, PCXHR_XLX_STATUS); | ||
508 | *value = (int)(reg & PCXHR_STAT_GPI_MASK) >> | ||
509 | PCXHR_STAT_GPI_OFFSET; | ||
510 | } else { | ||
511 | *value = (int)(mgr->dsp_reset & PCXHR_DSP_RESET_GPO_MASK) >> | ||
512 | PCXHR_DSP_RESET_GPO_OFFSET; | ||
513 | } | ||
514 | return 0; | ||
515 | } | ||
516 | |||
517 | |||
518 | int hr222_write_gpo(struct pcxhr_mgr *mgr, int value) | ||
519 | { | ||
520 | unsigned char reg = mgr->dsp_reset & ~PCXHR_DSP_RESET_GPO_MASK; | ||
521 | |||
522 | reg |= (unsigned char)(value << PCXHR_DSP_RESET_GPO_OFFSET) & | ||
523 | PCXHR_DSP_RESET_GPO_MASK; | ||
524 | |||
525 | PCXHR_OUTPB(mgr, PCXHR_DSP_RESET, reg); | ||
526 | mgr->dsp_reset = reg; | ||
527 | return 0; | ||
528 | } | ||
529 | |||
530 | |||
499 | int hr222_update_analog_audio_level(struct snd_pcxhr *chip, | 531 | int hr222_update_analog_audio_level(struct snd_pcxhr *chip, |
500 | int is_capture, int channel) | 532 | int is_capture, int channel) |
501 | { | 533 | { |
diff --git a/sound/pci/pcxhr/pcxhr_mix22.h b/sound/pci/pcxhr/pcxhr_mix22.h index 6b318b2f0100..5a37a0007e8f 100644 --- a/sound/pci/pcxhr/pcxhr_mix22.h +++ b/sound/pci/pcxhr/pcxhr_mix22.h | |||
@@ -32,6 +32,9 @@ int hr222_get_external_clock(struct pcxhr_mgr *mgr, | |||
32 | enum pcxhr_clock_type clock_type, | 32 | enum pcxhr_clock_type clock_type, |
33 | int *sample_rate); | 33 | int *sample_rate); |
34 | 34 | ||
35 | int hr222_read_gpio(struct pcxhr_mgr *mgr, int is_gpi, int *value); | ||
36 | int hr222_write_gpo(struct pcxhr_mgr *mgr, int value); | ||
37 | |||
35 | #define HR222_LINE_PLAYBACK_LEVEL_MIN 0 /* -25.5 dB */ | 38 | #define HR222_LINE_PLAYBACK_LEVEL_MIN 0 /* -25.5 dB */ |
36 | #define HR222_LINE_PLAYBACK_ZERO_LEVEL 51 /* 0.0 dB */ | 39 | #define HR222_LINE_PLAYBACK_ZERO_LEVEL 51 /* 0.0 dB */ |
37 | #define HR222_LINE_PLAYBACK_LEVEL_MAX 99 /* +24.0 dB */ | 40 | #define HR222_LINE_PLAYBACK_LEVEL_MAX 99 /* +24.0 dB */ |
diff --git a/sound/pci/pcxhr/pcxhr_mixer.c b/sound/pci/pcxhr/pcxhr_mixer.c index 2436e374586f..fec049344621 100644 --- a/sound/pci/pcxhr/pcxhr_mixer.c +++ b/sound/pci/pcxhr/pcxhr_mixer.c | |||
@@ -789,11 +789,15 @@ static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol, | |||
789 | if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) { | 789 | if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) { |
790 | mutex_lock(&mgr->setup_mutex); | 790 | mutex_lock(&mgr->setup_mutex); |
791 | mgr->use_clock_type = ucontrol->value.enumerated.item[0]; | 791 | mgr->use_clock_type = ucontrol->value.enumerated.item[0]; |
792 | if (mgr->use_clock_type) | 792 | rate = 0; |
793 | if (mgr->use_clock_type != PCXHR_CLOCK_TYPE_INTERNAL) { | ||
793 | pcxhr_get_external_clock(mgr, mgr->use_clock_type, | 794 | pcxhr_get_external_clock(mgr, mgr->use_clock_type, |
794 | &rate); | 795 | &rate); |
795 | else | 796 | } else { |
796 | rate = mgr->sample_rate; | 797 | rate = mgr->sample_rate; |
798 | if (!rate) | ||
799 | rate = 48000; | ||
800 | } | ||
797 | if (rate) { | 801 | if (rate) { |
798 | pcxhr_set_clock(mgr, rate); | 802 | pcxhr_set_clock(mgr, rate); |
799 | if (mgr->sample_rate) | 803 | if (mgr->sample_rate) |
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index 05b3f795a168..314e73531bd1 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c | |||
@@ -113,7 +113,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); | |||
113 | 113 | ||
114 | /* the meters are regular i/o-mapped registers, but offset | 114 | /* the meters are regular i/o-mapped registers, but offset |
115 | considerably from the rest. the peak registers are reset | 115 | considerably from the rest. the peak registers are reset |
116 | when read; the least-significant 4 bits are full-scale counters; | 116 | when read; the least-significant 4 bits are full-scale counters; |
117 | the actual peak value is in the most-significant 24 bits. | 117 | the actual peak value is in the most-significant 24 bits. |
118 | */ | 118 | */ |
119 | 119 | ||
@@ -131,7 +131,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); | |||
131 | 26*3 values are read in ss mode | 131 | 26*3 values are read in ss mode |
132 | 14*3 in ds mode, with no gap between values | 132 | 14*3 in ds mode, with no gap between values |
133 | */ | 133 | */ |
134 | #define HDSP_9652_peakBase 7164 | 134 | #define HDSP_9652_peakBase 7164 |
135 | #define HDSP_9652_rmsBase 4096 | 135 | #define HDSP_9652_rmsBase 4096 |
136 | 136 | ||
137 | /* c.f. the hdsp_9632_meters_t struct */ | 137 | /* c.f. the hdsp_9632_meters_t struct */ |
@@ -173,12 +173,12 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); | |||
173 | #define HDSP_SPDIFEmphasis (1<<10) /* 0=none, 1=on */ | 173 | #define HDSP_SPDIFEmphasis (1<<10) /* 0=none, 1=on */ |
174 | #define HDSP_SPDIFNonAudio (1<<11) /* 0=off, 1=on */ | 174 | #define HDSP_SPDIFNonAudio (1<<11) /* 0=off, 1=on */ |
175 | #define HDSP_SPDIFOpticalOut (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */ | 175 | #define HDSP_SPDIFOpticalOut (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */ |
176 | #define HDSP_SyncRef2 (1<<13) | 176 | #define HDSP_SyncRef2 (1<<13) |
177 | #define HDSP_SPDIFInputSelect0 (1<<14) | 177 | #define HDSP_SPDIFInputSelect0 (1<<14) |
178 | #define HDSP_SPDIFInputSelect1 (1<<15) | 178 | #define HDSP_SPDIFInputSelect1 (1<<15) |
179 | #define HDSP_SyncRef0 (1<<16) | 179 | #define HDSP_SyncRef0 (1<<16) |
180 | #define HDSP_SyncRef1 (1<<17) | 180 | #define HDSP_SyncRef1 (1<<17) |
181 | #define HDSP_AnalogExtensionBoard (1<<18) /* For H9632 cards */ | 181 | #define HDSP_AnalogExtensionBoard (1<<18) /* For H9632 cards */ |
182 | #define HDSP_XLRBreakoutCable (1<<20) /* For H9632 cards */ | 182 | #define HDSP_XLRBreakoutCable (1<<20) /* For H9632 cards */ |
183 | #define HDSP_Midi0InterruptEnable (1<<22) | 183 | #define HDSP_Midi0InterruptEnable (1<<22) |
184 | #define HDSP_Midi1InterruptEnable (1<<23) | 184 | #define HDSP_Midi1InterruptEnable (1<<23) |
@@ -314,7 +314,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); | |||
314 | #define HDSP_TimecodeSync (1<<27) | 314 | #define HDSP_TimecodeSync (1<<27) |
315 | #define HDSP_AEBO (1<<28) /* H9632 specific Analog Extension Boards */ | 315 | #define HDSP_AEBO (1<<28) /* H9632 specific Analog Extension Boards */ |
316 | #define HDSP_AEBI (1<<29) /* 0 = present, 1 = absent */ | 316 | #define HDSP_AEBI (1<<29) /* 0 = present, 1 = absent */ |
317 | #define HDSP_midi0IRQPending (1<<30) | 317 | #define HDSP_midi0IRQPending (1<<30) |
318 | #define HDSP_midi1IRQPending (1<<31) | 318 | #define HDSP_midi1IRQPending (1<<31) |
319 | 319 | ||
320 | #define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2) | 320 | #define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2) |
@@ -391,7 +391,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); | |||
391 | #define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES) | 391 | #define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES) |
392 | 392 | ||
393 | /* the size of the area we need to allocate for DMA transfers. the | 393 | /* the size of the area we need to allocate for DMA transfers. the |
394 | size is the same regardless of the number of channels - the | 394 | size is the same regardless of the number of channels - the |
395 | Multiface still uses the same memory area. | 395 | Multiface still uses the same memory area. |
396 | 396 | ||
397 | Note that we allocate 1 more channel than is apparently needed | 397 | Note that we allocate 1 more channel than is apparently needed |
@@ -460,7 +460,7 @@ struct hdsp { | |||
460 | unsigned char qs_in_channels; /* quad speed mode for H9632 */ | 460 | unsigned char qs_in_channels; /* quad speed mode for H9632 */ |
461 | unsigned char ds_in_channels; | 461 | unsigned char ds_in_channels; |
462 | unsigned char ss_in_channels; /* different for multiface/digiface */ | 462 | unsigned char ss_in_channels; /* different for multiface/digiface */ |
463 | unsigned char qs_out_channels; | 463 | unsigned char qs_out_channels; |
464 | unsigned char ds_out_channels; | 464 | unsigned char ds_out_channels; |
465 | unsigned char ss_out_channels; | 465 | unsigned char ss_out_channels; |
466 | 466 | ||
@@ -502,9 +502,9 @@ static char channel_map_df_ss[HDSP_MAX_CHANNELS] = { | |||
502 | 502 | ||
503 | static char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */ | 503 | static char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */ |
504 | /* Analog */ | 504 | /* Analog */ |
505 | 0, 1, 2, 3, 4, 5, 6, 7, | 505 | 0, 1, 2, 3, 4, 5, 6, 7, |
506 | /* ADAT 2 */ | 506 | /* ADAT 2 */ |
507 | 16, 17, 18, 19, 20, 21, 22, 23, | 507 | 16, 17, 18, 19, 20, 21, 22, 23, |
508 | /* SPDIF */ | 508 | /* SPDIF */ |
509 | 24, 25, | 509 | 24, 25, |
510 | -1, -1, -1, -1, -1, -1, -1, -1 | 510 | -1, -1, -1, -1, -1, -1, -1, -1 |
@@ -525,11 +525,11 @@ static char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = { | |||
525 | /* SPDIF */ | 525 | /* SPDIF */ |
526 | 8, 9, | 526 | 8, 9, |
527 | /* Analog */ | 527 | /* Analog */ |
528 | 10, 11, | 528 | 10, 11, |
529 | /* AO4S-192 and AI4S-192 extension boards */ | 529 | /* AO4S-192 and AI4S-192 extension boards */ |
530 | 12, 13, 14, 15, | 530 | 12, 13, 14, 15, |
531 | /* others don't exist */ | 531 | /* others don't exist */ |
532 | -1, -1, -1, -1, -1, -1, -1, -1, | 532 | -1, -1, -1, -1, -1, -1, -1, -1, |
533 | -1, -1 | 533 | -1, -1 |
534 | }; | 534 | }; |
535 | 535 | ||
@@ -539,7 +539,7 @@ static char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = { | |||
539 | /* SPDIF */ | 539 | /* SPDIF */ |
540 | 8, 9, | 540 | 8, 9, |
541 | /* Analog */ | 541 | /* Analog */ |
542 | 10, 11, | 542 | 10, 11, |
543 | /* AO4S-192 and AI4S-192 extension boards */ | 543 | /* AO4S-192 and AI4S-192 extension boards */ |
544 | 12, 13, 14, 15, | 544 | 12, 13, 14, 15, |
545 | /* others don't exist */ | 545 | /* others don't exist */ |
@@ -587,7 +587,7 @@ static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_d | |||
587 | static struct pci_device_id snd_hdsp_ids[] = { | 587 | static struct pci_device_id snd_hdsp_ids[] = { |
588 | { | 588 | { |
589 | .vendor = PCI_VENDOR_ID_XILINX, | 589 | .vendor = PCI_VENDOR_ID_XILINX, |
590 | .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, | 590 | .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, |
591 | .subvendor = PCI_ANY_ID, | 591 | .subvendor = PCI_ANY_ID, |
592 | .subdevice = PCI_ANY_ID, | 592 | .subdevice = PCI_ANY_ID, |
593 | }, /* RME Hammerfall-DSP */ | 593 | }, /* RME Hammerfall-DSP */ |
@@ -653,7 +653,6 @@ static unsigned int hdsp_read(struct hdsp *hdsp, int reg) | |||
653 | 653 | ||
654 | static int hdsp_check_for_iobox (struct hdsp *hdsp) | 654 | static int hdsp_check_for_iobox (struct hdsp *hdsp) |
655 | { | 655 | { |
656 | |||
657 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0; | 656 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0; |
658 | if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) { | 657 | if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) { |
659 | snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n"); | 658 | snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n"); |
@@ -661,7 +660,29 @@ static int hdsp_check_for_iobox (struct hdsp *hdsp) | |||
661 | return -EIO; | 660 | return -EIO; |
662 | } | 661 | } |
663 | return 0; | 662 | return 0; |
663 | } | ||
664 | 664 | ||
665 | static int hdsp_wait_for_iobox(struct hdsp *hdsp, unsigned int loops, | ||
666 | unsigned int delay) | ||
667 | { | ||
668 | unsigned int i; | ||
669 | |||
670 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) | ||
671 | return 0; | ||
672 | |||
673 | for (i = 0; i != loops; ++i) { | ||
674 | if (hdsp_read(hdsp, HDSP_statusRegister) & HDSP_ConfigError) | ||
675 | msleep(delay); | ||
676 | else { | ||
677 | snd_printd("Hammerfall-DSP: iobox found after %ums!\n", | ||
678 | i * delay); | ||
679 | return 0; | ||
680 | } | ||
681 | } | ||
682 | |||
683 | snd_printk("Hammerfall-DSP: no Digiface or Multiface connected!\n"); | ||
684 | hdsp->state &= ~HDSP_FirmwareLoaded; | ||
685 | return -EIO; | ||
665 | } | 686 | } |
666 | 687 | ||
667 | static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { | 688 | static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { |
@@ -670,19 +691,19 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { | |||
670 | unsigned long flags; | 691 | unsigned long flags; |
671 | 692 | ||
672 | if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { | 693 | if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { |
673 | 694 | ||
674 | snd_printk ("Hammerfall-DSP: loading firmware\n"); | 695 | snd_printk ("Hammerfall-DSP: loading firmware\n"); |
675 | 696 | ||
676 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_PROGRAM); | 697 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_PROGRAM); |
677 | hdsp_write (hdsp, HDSP_fifoData, 0); | 698 | hdsp_write (hdsp, HDSP_fifoData, 0); |
678 | 699 | ||
679 | if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { | 700 | if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { |
680 | snd_printk ("Hammerfall-DSP: timeout waiting for download preparation\n"); | 701 | snd_printk ("Hammerfall-DSP: timeout waiting for download preparation\n"); |
681 | return -EIO; | 702 | return -EIO; |
682 | } | 703 | } |
683 | 704 | ||
684 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD); | 705 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD); |
685 | 706 | ||
686 | for (i = 0; i < 24413; ++i) { | 707 | for (i = 0; i < 24413; ++i) { |
687 | hdsp_write(hdsp, HDSP_fifoData, hdsp->firmware_cache[i]); | 708 | hdsp_write(hdsp, HDSP_fifoData, hdsp->firmware_cache[i]); |
688 | if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) { | 709 | if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) { |
@@ -692,7 +713,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { | |||
692 | } | 713 | } |
693 | 714 | ||
694 | ssleep(3); | 715 | ssleep(3); |
695 | 716 | ||
696 | if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { | 717 | if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { |
697 | snd_printk ("Hammerfall-DSP: timeout at end of firmware loading\n"); | 718 | snd_printk ("Hammerfall-DSP: timeout at end of firmware loading\n"); |
698 | return -EIO; | 719 | return -EIO; |
@@ -705,15 +726,15 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { | |||
705 | #endif | 726 | #endif |
706 | hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register); | 727 | hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register); |
707 | snd_printk ("Hammerfall-DSP: finished firmware loading\n"); | 728 | snd_printk ("Hammerfall-DSP: finished firmware loading\n"); |
708 | 729 | ||
709 | } | 730 | } |
710 | if (hdsp->state & HDSP_InitializationComplete) { | 731 | if (hdsp->state & HDSP_InitializationComplete) { |
711 | snd_printk(KERN_INFO "Hammerfall-DSP: firmware loaded from cache, restoring defaults\n"); | 732 | snd_printk(KERN_INFO "Hammerfall-DSP: firmware loaded from cache, restoring defaults\n"); |
712 | spin_lock_irqsave(&hdsp->lock, flags); | 733 | spin_lock_irqsave(&hdsp->lock, flags); |
713 | snd_hdsp_set_defaults(hdsp); | 734 | snd_hdsp_set_defaults(hdsp); |
714 | spin_unlock_irqrestore(&hdsp->lock, flags); | 735 | spin_unlock_irqrestore(&hdsp->lock, flags); |
715 | } | 736 | } |
716 | 737 | ||
717 | hdsp->state |= HDSP_FirmwareLoaded; | 738 | hdsp->state |= HDSP_FirmwareLoaded; |
718 | 739 | ||
719 | return 0; | 740 | return 0; |
@@ -722,7 +743,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { | |||
722 | static int hdsp_get_iobox_version (struct hdsp *hdsp) | 743 | static int hdsp_get_iobox_version (struct hdsp *hdsp) |
723 | { | 744 | { |
724 | if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { | 745 | if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { |
725 | 746 | ||
726 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_PROGRAM); | 747 | hdsp_write (hdsp, HDSP_control2Reg, HDSP_PROGRAM); |
727 | hdsp_write (hdsp, HDSP_fifoData, 0); | 748 | hdsp_write (hdsp, HDSP_fifoData, 0); |
728 | if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) | 749 | if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) |
@@ -738,7 +759,7 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp) | |||
738 | hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT); | 759 | hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT); |
739 | } else { | 760 | } else { |
740 | hdsp->io_type = Digiface; | 761 | hdsp->io_type = Digiface; |
741 | } | 762 | } |
742 | } else { | 763 | } else { |
743 | /* firmware was already loaded, get iobox type */ | 764 | /* firmware was already loaded, get iobox type */ |
744 | if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) | 765 | if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) |
@@ -786,13 +807,13 @@ static int hdsp_check_for_firmware (struct hdsp *hdsp, int load_on_demand) | |||
786 | 807 | ||
787 | 808 | ||
788 | static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout) | 809 | static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout) |
789 | { | 810 | { |
790 | int i; | 811 | int i; |
791 | 812 | ||
792 | /* the fifoStatus registers reports on how many words | 813 | /* the fifoStatus registers reports on how many words |
793 | are available in the command FIFO. | 814 | are available in the command FIFO. |
794 | */ | 815 | */ |
795 | 816 | ||
796 | for (i = 0; i < timeout; i++) { | 817 | for (i = 0; i < timeout; i++) { |
797 | 818 | ||
798 | if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count) | 819 | if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count) |
@@ -824,11 +845,11 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short | |||
824 | 845 | ||
825 | if (addr >= HDSP_MATRIX_MIXER_SIZE) | 846 | if (addr >= HDSP_MATRIX_MIXER_SIZE) |
826 | return -1; | 847 | return -1; |
827 | 848 | ||
828 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) { | 849 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) { |
829 | 850 | ||
830 | /* from martin bjornsen: | 851 | /* from martin bjornsen: |
831 | 852 | ||
832 | "You can only write dwords to the | 853 | "You can only write dwords to the |
833 | mixer memory which contain two | 854 | mixer memory which contain two |
834 | mixer values in the low and high | 855 | mixer values in the low and high |
@@ -847,7 +868,7 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short | |||
847 | 868 | ||
848 | hdsp->mixer_matrix[addr] = data; | 869 | hdsp->mixer_matrix[addr] = data; |
849 | 870 | ||
850 | 871 | ||
851 | /* `addr' addresses a 16-bit wide address, but | 872 | /* `addr' addresses a 16-bit wide address, but |
852 | the address space accessed via hdsp_write | 873 | the address space accessed via hdsp_write |
853 | uses byte offsets. put another way, addr | 874 | uses byte offsets. put another way, addr |
@@ -856,17 +877,17 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short | |||
856 | to access 0 to 2703 ... | 877 | to access 0 to 2703 ... |
857 | */ | 878 | */ |
858 | ad = addr/2; | 879 | ad = addr/2; |
859 | 880 | ||
860 | hdsp_write (hdsp, 4096 + (ad*4), | 881 | hdsp_write (hdsp, 4096 + (ad*4), |
861 | (hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) + | 882 | (hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) + |
862 | hdsp->mixer_matrix[addr&0x7fe]); | 883 | hdsp->mixer_matrix[addr&0x7fe]); |
863 | 884 | ||
864 | return 0; | 885 | return 0; |
865 | 886 | ||
866 | } else { | 887 | } else { |
867 | 888 | ||
868 | ad = (addr << 16) + data; | 889 | ad = (addr << 16) + data; |
869 | 890 | ||
870 | if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT)) | 891 | if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT)) |
871 | return -1; | 892 | return -1; |
872 | 893 | ||
@@ -902,7 +923,7 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp) | |||
902 | 923 | ||
903 | if (status & HDSP_SPDIFErrorFlag) | 924 | if (status & HDSP_SPDIFErrorFlag) |
904 | return 0; | 925 | return 0; |
905 | 926 | ||
906 | switch (rate_bits) { | 927 | switch (rate_bits) { |
907 | case HDSP_spdifFrequency32KHz: return 32000; | 928 | case HDSP_spdifFrequency32KHz: return 32000; |
908 | case HDSP_spdifFrequency44_1KHz: return 44100; | 929 | case HDSP_spdifFrequency44_1KHz: return 44100; |
@@ -910,13 +931,13 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp) | |||
910 | case HDSP_spdifFrequency64KHz: return 64000; | 931 | case HDSP_spdifFrequency64KHz: return 64000; |
911 | case HDSP_spdifFrequency88_2KHz: return 88200; | 932 | case HDSP_spdifFrequency88_2KHz: return 88200; |
912 | case HDSP_spdifFrequency96KHz: return 96000; | 933 | case HDSP_spdifFrequency96KHz: return 96000; |
913 | case HDSP_spdifFrequency128KHz: | 934 | case HDSP_spdifFrequency128KHz: |
914 | if (hdsp->io_type == H9632) return 128000; | 935 | if (hdsp->io_type == H9632) return 128000; |
915 | break; | 936 | break; |
916 | case HDSP_spdifFrequency176_4KHz: | 937 | case HDSP_spdifFrequency176_4KHz: |
917 | if (hdsp->io_type == H9632) return 176400; | 938 | if (hdsp->io_type == H9632) return 176400; |
918 | break; | 939 | break; |
919 | case HDSP_spdifFrequency192KHz: | 940 | case HDSP_spdifFrequency192KHz: |
920 | if (hdsp->io_type == H9632) return 192000; | 941 | if (hdsp->io_type == H9632) return 192000; |
921 | break; | 942 | break; |
922 | default: | 943 | default: |
@@ -1027,7 +1048,7 @@ static void hdsp_set_dds_value(struct hdsp *hdsp, int rate) | |||
1027 | { | 1048 | { |
1028 | u64 n; | 1049 | u64 n; |
1029 | u32 r; | 1050 | u32 r; |
1030 | 1051 | ||
1031 | if (rate >= 112000) | 1052 | if (rate >= 112000) |
1032 | rate /= 4; | 1053 | rate /= 4; |
1033 | else if (rate >= 56000) | 1054 | else if (rate >= 56000) |
@@ -1053,35 +1074,35 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) | |||
1053 | there is no need for it (e.g. during module | 1074 | there is no need for it (e.g. during module |
1054 | initialization). | 1075 | initialization). |
1055 | */ | 1076 | */ |
1056 | 1077 | ||
1057 | if (!(hdsp->control_register & HDSP_ClockModeMaster)) { | 1078 | if (!(hdsp->control_register & HDSP_ClockModeMaster)) { |
1058 | if (called_internally) { | 1079 | if (called_internally) { |
1059 | /* request from ctl or card initialization */ | 1080 | /* request from ctl or card initialization */ |
1060 | snd_printk(KERN_ERR "Hammerfall-DSP: device is not running as a clock master: cannot set sample rate.\n"); | 1081 | snd_printk(KERN_ERR "Hammerfall-DSP: device is not running as a clock master: cannot set sample rate.\n"); |
1061 | return -1; | 1082 | return -1; |
1062 | } else { | 1083 | } else { |
1063 | /* hw_param request while in AutoSync mode */ | 1084 | /* hw_param request while in AutoSync mode */ |
1064 | int external_freq = hdsp_external_sample_rate(hdsp); | 1085 | int external_freq = hdsp_external_sample_rate(hdsp); |
1065 | int spdif_freq = hdsp_spdif_sample_rate(hdsp); | 1086 | int spdif_freq = hdsp_spdif_sample_rate(hdsp); |
1066 | 1087 | ||
1067 | if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) | 1088 | if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) |
1068 | snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in double speed mode\n"); | 1089 | snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in double speed mode\n"); |
1069 | else if (hdsp->io_type == H9632 && (spdif_freq == external_freq*4) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) | 1090 | else if (hdsp->io_type == H9632 && (spdif_freq == external_freq*4) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) |
1070 | snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in quad speed mode\n"); | 1091 | snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in quad speed mode\n"); |
1071 | else if (rate != external_freq) { | 1092 | else if (rate != external_freq) { |
1072 | snd_printk(KERN_INFO "Hammerfall-DSP: No AutoSync source for requested rate\n"); | 1093 | snd_printk(KERN_INFO "Hammerfall-DSP: No AutoSync source for requested rate\n"); |
1073 | return -1; | 1094 | return -1; |
1074 | } | 1095 | } |
1075 | } | 1096 | } |
1076 | } | 1097 | } |
1077 | 1098 | ||
1078 | current_rate = hdsp->system_sample_rate; | 1099 | current_rate = hdsp->system_sample_rate; |
1079 | 1100 | ||
1080 | /* Changing from a "single speed" to a "double speed" rate is | 1101 | /* Changing from a "single speed" to a "double speed" rate is |
1081 | not allowed if any substreams are open. This is because | 1102 | not allowed if any substreams are open. This is because |
1082 | such a change causes a shift in the location of | 1103 | such a change causes a shift in the location of |
1083 | the DMA buffers and a reduction in the number of available | 1104 | the DMA buffers and a reduction in the number of available |
1084 | buffers. | 1105 | buffers. |
1085 | 1106 | ||
1086 | Note that a similar but essentially insoluble problem | 1107 | Note that a similar but essentially insoluble problem |
1087 | exists for externally-driven rate changes. All we can do | 1108 | exists for externally-driven rate changes. All we can do |
@@ -1089,7 +1110,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) | |||
1089 | 1110 | ||
1090 | if (rate > 96000 && hdsp->io_type != H9632) | 1111 | if (rate > 96000 && hdsp->io_type != H9632) |
1091 | return -EINVAL; | 1112 | return -EINVAL; |
1092 | 1113 | ||
1093 | switch (rate) { | 1114 | switch (rate) { |
1094 | case 32000: | 1115 | case 32000: |
1095 | if (current_rate > 48000) | 1116 | if (current_rate > 48000) |
@@ -1179,7 +1200,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) | |||
1179 | break; | 1200 | break; |
1180 | } | 1201 | } |
1181 | } | 1202 | } |
1182 | 1203 | ||
1183 | hdsp->system_sample_rate = rate; | 1204 | hdsp->system_sample_rate = rate; |
1184 | 1205 | ||
1185 | return 0; | 1206 | return 0; |
@@ -1245,16 +1266,16 @@ static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi) | |||
1245 | unsigned char buf[128]; | 1266 | unsigned char buf[128]; |
1246 | 1267 | ||
1247 | /* Output is not interrupt driven */ | 1268 | /* Output is not interrupt driven */ |
1248 | 1269 | ||
1249 | spin_lock_irqsave (&hmidi->lock, flags); | 1270 | spin_lock_irqsave (&hmidi->lock, flags); |
1250 | if (hmidi->output) { | 1271 | if (hmidi->output) { |
1251 | if (!snd_rawmidi_transmit_empty (hmidi->output)) { | 1272 | if (!snd_rawmidi_transmit_empty (hmidi->output)) { |
1252 | if ((n_pending = snd_hdsp_midi_output_possible (hmidi->hdsp, hmidi->id)) > 0) { | 1273 | if ((n_pending = snd_hdsp_midi_output_possible (hmidi->hdsp, hmidi->id)) > 0) { |
1253 | if (n_pending > (int)sizeof (buf)) | 1274 | if (n_pending > (int)sizeof (buf)) |
1254 | n_pending = sizeof (buf); | 1275 | n_pending = sizeof (buf); |
1255 | 1276 | ||
1256 | if ((to_write = snd_rawmidi_transmit (hmidi->output, buf, n_pending)) > 0) { | 1277 | if ((to_write = snd_rawmidi_transmit (hmidi->output, buf, n_pending)) > 0) { |
1257 | for (i = 0; i < to_write; ++i) | 1278 | for (i = 0; i < to_write; ++i) |
1258 | snd_hdsp_midi_write_byte (hmidi->hdsp, hmidi->id, buf[i]); | 1279 | snd_hdsp_midi_write_byte (hmidi->hdsp, hmidi->id, buf[i]); |
1259 | } | 1280 | } |
1260 | } | 1281 | } |
@@ -1325,14 +1346,14 @@ static void snd_hdsp_midi_output_timer(unsigned long data) | |||
1325 | { | 1346 | { |
1326 | struct hdsp_midi *hmidi = (struct hdsp_midi *) data; | 1347 | struct hdsp_midi *hmidi = (struct hdsp_midi *) data; |
1327 | unsigned long flags; | 1348 | unsigned long flags; |
1328 | 1349 | ||
1329 | snd_hdsp_midi_output_write(hmidi); | 1350 | snd_hdsp_midi_output_write(hmidi); |
1330 | spin_lock_irqsave (&hmidi->lock, flags); | 1351 | spin_lock_irqsave (&hmidi->lock, flags); |
1331 | 1352 | ||
1332 | /* this does not bump hmidi->istimer, because the | 1353 | /* this does not bump hmidi->istimer, because the |
1333 | kernel automatically removed the timer when it | 1354 | kernel automatically removed the timer when it |
1334 | expired, and we are now adding it back, thus | 1355 | expired, and we are now adding it back, thus |
1335 | leaving istimer wherever it was set before. | 1356 | leaving istimer wherever it was set before. |
1336 | */ | 1357 | */ |
1337 | 1358 | ||
1338 | if (hmidi->istimer) { | 1359 | if (hmidi->istimer) { |
@@ -1501,7 +1522,7 @@ static int snd_hdsp_control_spdif_info(struct snd_kcontrol *kcontrol, struct snd | |||
1501 | static int snd_hdsp_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1522 | static int snd_hdsp_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1502 | { | 1523 | { |
1503 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1524 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1504 | 1525 | ||
1505 | snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif); | 1526 | snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif); |
1506 | return 0; | 1527 | return 0; |
1507 | } | 1528 | } |
@@ -1511,7 +1532,7 @@ static int snd_hdsp_control_spdif_put(struct snd_kcontrol *kcontrol, struct snd_ | |||
1511 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1532 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1512 | int change; | 1533 | int change; |
1513 | u32 val; | 1534 | u32 val; |
1514 | 1535 | ||
1515 | val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); | 1536 | val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); |
1516 | spin_lock_irq(&hdsp->lock); | 1537 | spin_lock_irq(&hdsp->lock); |
1517 | change = val != hdsp->creg_spdif; | 1538 | change = val != hdsp->creg_spdif; |
@@ -1530,7 +1551,7 @@ static int snd_hdsp_control_spdif_stream_info(struct snd_kcontrol *kcontrol, str | |||
1530 | static int snd_hdsp_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1551 | static int snd_hdsp_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1531 | { | 1552 | { |
1532 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1553 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1533 | 1554 | ||
1534 | snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif_stream); | 1555 | snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif_stream); |
1535 | return 0; | 1556 | return 0; |
1536 | } | 1557 | } |
@@ -1540,7 +1561,7 @@ static int snd_hdsp_control_spdif_stream_put(struct snd_kcontrol *kcontrol, stru | |||
1540 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1561 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1541 | int change; | 1562 | int change; |
1542 | u32 val; | 1563 | u32 val; |
1543 | 1564 | ||
1544 | val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); | 1565 | val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); |
1545 | spin_lock_irq(&hdsp->lock); | 1566 | spin_lock_irq(&hdsp->lock); |
1546 | change = val != hdsp->creg_spdif_stream; | 1567 | change = val != hdsp->creg_spdif_stream; |
@@ -1602,7 +1623,7 @@ static int snd_hdsp_info_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
1602 | static int snd_hdsp_get_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1623 | static int snd_hdsp_get_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1603 | { | 1624 | { |
1604 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1625 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1605 | 1626 | ||
1606 | ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp); | 1627 | ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp); |
1607 | return 0; | 1628 | return 0; |
1608 | } | 1629 | } |
@@ -1612,7 +1633,7 @@ static int snd_hdsp_put_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
1612 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1633 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1613 | int change; | 1634 | int change; |
1614 | unsigned int val; | 1635 | unsigned int val; |
1615 | 1636 | ||
1616 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 1637 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
1617 | return -EBUSY; | 1638 | return -EBUSY; |
1618 | val = ucontrol->value.enumerated.item[0] % ((hdsp->io_type == H9632) ? 4 : 3); | 1639 | val = ucontrol->value.enumerated.item[0] % ((hdsp->io_type == H9632) ? 4 : 3); |
@@ -1649,7 +1670,7 @@ static int hdsp_set_spdif_output(struct hdsp *hdsp, int out) | |||
1649 | static int snd_hdsp_get_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1670 | static int snd_hdsp_get_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1650 | { | 1671 | { |
1651 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1672 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1652 | 1673 | ||
1653 | ucontrol->value.integer.value[0] = hdsp_spdif_out(hdsp); | 1674 | ucontrol->value.integer.value[0] = hdsp_spdif_out(hdsp); |
1654 | return 0; | 1675 | return 0; |
1655 | } | 1676 | } |
@@ -1659,7 +1680,7 @@ static int snd_hdsp_put_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
1659 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1680 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1660 | int change; | 1681 | int change; |
1661 | unsigned int val; | 1682 | unsigned int val; |
1662 | 1683 | ||
1663 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 1684 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
1664 | return -EBUSY; | 1685 | return -EBUSY; |
1665 | val = ucontrol->value.integer.value[0] & 1; | 1686 | val = ucontrol->value.integer.value[0] & 1; |
@@ -1693,7 +1714,7 @@ static int hdsp_set_spdif_professional(struct hdsp *hdsp, int val) | |||
1693 | static int snd_hdsp_get_spdif_professional(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1714 | static int snd_hdsp_get_spdif_professional(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1694 | { | 1715 | { |
1695 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1716 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1696 | 1717 | ||
1697 | ucontrol->value.integer.value[0] = hdsp_spdif_professional(hdsp); | 1718 | ucontrol->value.integer.value[0] = hdsp_spdif_professional(hdsp); |
1698 | return 0; | 1719 | return 0; |
1699 | } | 1720 | } |
@@ -1703,7 +1724,7 @@ static int snd_hdsp_put_spdif_professional(struct snd_kcontrol *kcontrol, struct | |||
1703 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1724 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1704 | int change; | 1725 | int change; |
1705 | unsigned int val; | 1726 | unsigned int val; |
1706 | 1727 | ||
1707 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 1728 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
1708 | return -EBUSY; | 1729 | return -EBUSY; |
1709 | val = ucontrol->value.integer.value[0] & 1; | 1730 | val = ucontrol->value.integer.value[0] & 1; |
@@ -1737,7 +1758,7 @@ static int hdsp_set_spdif_emphasis(struct hdsp *hdsp, int val) | |||
1737 | static int snd_hdsp_get_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1758 | static int snd_hdsp_get_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1738 | { | 1759 | { |
1739 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1760 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1740 | 1761 | ||
1741 | ucontrol->value.integer.value[0] = hdsp_spdif_emphasis(hdsp); | 1762 | ucontrol->value.integer.value[0] = hdsp_spdif_emphasis(hdsp); |
1742 | return 0; | 1763 | return 0; |
1743 | } | 1764 | } |
@@ -1747,7 +1768,7 @@ static int snd_hdsp_put_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd | |||
1747 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1768 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1748 | int change; | 1769 | int change; |
1749 | unsigned int val; | 1770 | unsigned int val; |
1750 | 1771 | ||
1751 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 1772 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
1752 | return -EBUSY; | 1773 | return -EBUSY; |
1753 | val = ucontrol->value.integer.value[0] & 1; | 1774 | val = ucontrol->value.integer.value[0] & 1; |
@@ -1781,7 +1802,7 @@ static int hdsp_set_spdif_nonaudio(struct hdsp *hdsp, int val) | |||
1781 | static int snd_hdsp_get_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1802 | static int snd_hdsp_get_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1782 | { | 1803 | { |
1783 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1804 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1784 | 1805 | ||
1785 | ucontrol->value.integer.value[0] = hdsp_spdif_nonaudio(hdsp); | 1806 | ucontrol->value.integer.value[0] = hdsp_spdif_nonaudio(hdsp); |
1786 | return 0; | 1807 | return 0; |
1787 | } | 1808 | } |
@@ -1791,7 +1812,7 @@ static int snd_hdsp_put_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd | |||
1791 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1812 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1792 | int change; | 1813 | int change; |
1793 | unsigned int val; | 1814 | unsigned int val; |
1794 | 1815 | ||
1795 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 1816 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
1796 | return -EBUSY; | 1817 | return -EBUSY; |
1797 | val = ucontrol->value.integer.value[0] & 1; | 1818 | val = ucontrol->value.integer.value[0] & 1; |
@@ -1828,7 +1849,7 @@ static int snd_hdsp_info_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct | |||
1828 | static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1849 | static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1829 | { | 1850 | { |
1830 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1851 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1831 | 1852 | ||
1832 | switch (hdsp_spdif_sample_rate(hdsp)) { | 1853 | switch (hdsp_spdif_sample_rate(hdsp)) { |
1833 | case 32000: | 1854 | case 32000: |
1834 | ucontrol->value.enumerated.item[0] = 0; | 1855 | ucontrol->value.enumerated.item[0] = 0; |
@@ -1858,7 +1879,7 @@ static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct | |||
1858 | ucontrol->value.enumerated.item[0] = 9; | 1879 | ucontrol->value.enumerated.item[0] = 9; |
1859 | break; | 1880 | break; |
1860 | default: | 1881 | default: |
1861 | ucontrol->value.enumerated.item[0] = 6; | 1882 | ucontrol->value.enumerated.item[0] = 6; |
1862 | } | 1883 | } |
1863 | return 0; | 1884 | return 0; |
1864 | } | 1885 | } |
@@ -1882,7 +1903,7 @@ static int snd_hdsp_info_system_sample_rate(struct snd_kcontrol *kcontrol, struc | |||
1882 | static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1903 | static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1883 | { | 1904 | { |
1884 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1905 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1885 | 1906 | ||
1886 | ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate; | 1907 | ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate; |
1887 | return 0; | 1908 | return 0; |
1888 | } | 1909 | } |
@@ -1899,7 +1920,7 @@ static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct | |||
1899 | static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 1920 | static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
1900 | { | 1921 | { |
1901 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1922 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1902 | static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"}; | 1923 | static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"}; |
1903 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 1924 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
1904 | uinfo->count = 1; | 1925 | uinfo->count = 1; |
1905 | uinfo->value.enumerated.items = (hdsp->io_type == H9632) ? 10 : 7 ; | 1926 | uinfo->value.enumerated.items = (hdsp->io_type == H9632) ? 10 : 7 ; |
@@ -1912,7 +1933,7 @@ static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, str | |||
1912 | static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 1933 | static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1913 | { | 1934 | { |
1914 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 1935 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1915 | 1936 | ||
1916 | switch (hdsp_external_sample_rate(hdsp)) { | 1937 | switch (hdsp_external_sample_rate(hdsp)) { |
1917 | case 32000: | 1938 | case 32000: |
1918 | ucontrol->value.enumerated.item[0] = 0; | 1939 | ucontrol->value.enumerated.item[0] = 0; |
@@ -1940,9 +1961,9 @@ static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, stru | |||
1940 | break; | 1961 | break; |
1941 | case 192000: | 1962 | case 192000: |
1942 | ucontrol->value.enumerated.item[0] = 9; | 1963 | ucontrol->value.enumerated.item[0] = 9; |
1943 | break; | 1964 | break; |
1944 | default: | 1965 | default: |
1945 | ucontrol->value.enumerated.item[0] = 6; | 1966 | ucontrol->value.enumerated.item[0] = 6; |
1946 | } | 1967 | } |
1947 | return 0; | 1968 | return 0; |
1948 | } | 1969 | } |
@@ -1968,7 +1989,7 @@ static int hdsp_system_clock_mode(struct hdsp *hdsp) | |||
1968 | static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 1989 | static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
1969 | { | 1990 | { |
1970 | static char *texts[] = {"Master", "Slave" }; | 1991 | static char *texts[] = {"Master", "Slave" }; |
1971 | 1992 | ||
1972 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 1993 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
1973 | uinfo->count = 1; | 1994 | uinfo->count = 1; |
1974 | uinfo->value.enumerated.items = 2; | 1995 | uinfo->value.enumerated.items = 2; |
@@ -1981,7 +2002,7 @@ static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct | |||
1981 | static int snd_hdsp_get_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2002 | static int snd_hdsp_get_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
1982 | { | 2003 | { |
1983 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2004 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
1984 | 2005 | ||
1985 | ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp); | 2006 | ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp); |
1986 | return 0; | 2007 | return 0; |
1987 | } | 2008 | } |
@@ -2018,7 +2039,7 @@ static int hdsp_clock_source(struct hdsp *hdsp) | |||
2018 | case 192000: | 2039 | case 192000: |
2019 | return 9; | 2040 | return 9; |
2020 | default: | 2041 | default: |
2021 | return 3; | 2042 | return 3; |
2022 | } | 2043 | } |
2023 | } else { | 2044 | } else { |
2024 | return 0; | 2045 | return 0; |
@@ -2032,7 +2053,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode) | |||
2032 | case HDSP_CLOCK_SOURCE_AUTOSYNC: | 2053 | case HDSP_CLOCK_SOURCE_AUTOSYNC: |
2033 | if (hdsp_external_sample_rate(hdsp) != 0) { | 2054 | if (hdsp_external_sample_rate(hdsp) != 0) { |
2034 | if (!hdsp_set_rate(hdsp, hdsp_external_sample_rate(hdsp), 1)) { | 2055 | if (!hdsp_set_rate(hdsp, hdsp_external_sample_rate(hdsp), 1)) { |
2035 | hdsp->control_register &= ~HDSP_ClockModeMaster; | 2056 | hdsp->control_register &= ~HDSP_ClockModeMaster; |
2036 | hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); | 2057 | hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); |
2037 | return 0; | 2058 | return 0; |
2038 | } | 2059 | } |
@@ -2043,7 +2064,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode) | |||
2043 | break; | 2064 | break; |
2044 | case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ: | 2065 | case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ: |
2045 | rate = 44100; | 2066 | rate = 44100; |
2046 | break; | 2067 | break; |
2047 | case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ: | 2068 | case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ: |
2048 | rate = 48000; | 2069 | rate = 48000; |
2049 | break; | 2070 | break; |
@@ -2078,13 +2099,13 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_ | |||
2078 | { | 2099 | { |
2079 | static char *texts[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz", "Internal 192.0 KHz" }; | 2100 | static char *texts[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz", "Internal 192.0 KHz" }; |
2080 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2101 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2081 | 2102 | ||
2082 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2103 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2083 | uinfo->count = 1; | 2104 | uinfo->count = 1; |
2084 | if (hdsp->io_type == H9632) | 2105 | if (hdsp->io_type == H9632) |
2085 | uinfo->value.enumerated.items = 10; | 2106 | uinfo->value.enumerated.items = 10; |
2086 | else | 2107 | else |
2087 | uinfo->value.enumerated.items = 7; | 2108 | uinfo->value.enumerated.items = 7; |
2088 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) | 2109 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) |
2089 | uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; | 2110 | uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; |
2090 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); | 2111 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); |
@@ -2094,7 +2115,7 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_ | |||
2094 | static int snd_hdsp_get_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2115 | static int snd_hdsp_get_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2095 | { | 2116 | { |
2096 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2117 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2097 | 2118 | ||
2098 | ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp); | 2119 | ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp); |
2099 | return 0; | 2120 | return 0; |
2100 | } | 2121 | } |
@@ -2104,7 +2125,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c | |||
2104 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2125 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2105 | int change; | 2126 | int change; |
2106 | int val; | 2127 | int val; |
2107 | 2128 | ||
2108 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2129 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2109 | return -EBUSY; | 2130 | return -EBUSY; |
2110 | val = ucontrol->value.enumerated.item[0]; | 2131 | val = ucontrol->value.enumerated.item[0]; |
@@ -2130,7 +2151,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c | |||
2130 | static int snd_hdsp_get_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2151 | static int snd_hdsp_get_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2131 | { | 2152 | { |
2132 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2153 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2133 | 2154 | ||
2134 | ucontrol->value.integer.value[0] = hdsp->clock_source_locked; | 2155 | ucontrol->value.integer.value[0] = hdsp->clock_source_locked; |
2135 | return 0; | 2156 | return 0; |
2136 | } | 2157 | } |
@@ -2165,7 +2186,7 @@ static int hdsp_da_gain(struct hdsp *hdsp) | |||
2165 | case HDSP_DAGainMinus10dBV: | 2186 | case HDSP_DAGainMinus10dBV: |
2166 | return 2; | 2187 | return 2; |
2167 | default: | 2188 | default: |
2168 | return 1; | 2189 | return 1; |
2169 | } | 2190 | } |
2170 | } | 2191 | } |
2171 | 2192 | ||
@@ -2180,8 +2201,8 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode) | |||
2180 | hdsp->control_register |= HDSP_DAGainPlus4dBu; | 2201 | hdsp->control_register |= HDSP_DAGainPlus4dBu; |
2181 | break; | 2202 | break; |
2182 | case 2: | 2203 | case 2: |
2183 | hdsp->control_register |= HDSP_DAGainMinus10dBV; | 2204 | hdsp->control_register |= HDSP_DAGainMinus10dBV; |
2184 | break; | 2205 | break; |
2185 | default: | 2206 | default: |
2186 | return -1; | 2207 | return -1; |
2187 | 2208 | ||
@@ -2193,7 +2214,7 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode) | |||
2193 | static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 2214 | static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
2194 | { | 2215 | { |
2195 | static char *texts[] = {"Hi Gain", "+4 dBu", "-10 dbV"}; | 2216 | static char *texts[] = {"Hi Gain", "+4 dBu", "-10 dbV"}; |
2196 | 2217 | ||
2197 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2218 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2198 | uinfo->count = 1; | 2219 | uinfo->count = 1; |
2199 | uinfo->value.enumerated.items = 3; | 2220 | uinfo->value.enumerated.items = 3; |
@@ -2206,7 +2227,7 @@ static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
2206 | static int snd_hdsp_get_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2227 | static int snd_hdsp_get_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2207 | { | 2228 | { |
2208 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2229 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2209 | 2230 | ||
2210 | ucontrol->value.enumerated.item[0] = hdsp_da_gain(hdsp); | 2231 | ucontrol->value.enumerated.item[0] = hdsp_da_gain(hdsp); |
2211 | return 0; | 2232 | return 0; |
2212 | } | 2233 | } |
@@ -2216,7 +2237,7 @@ static int snd_hdsp_put_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
2216 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2237 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2217 | int change; | 2238 | int change; |
2218 | int val; | 2239 | int val; |
2219 | 2240 | ||
2220 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2241 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2221 | return -EBUSY; | 2242 | return -EBUSY; |
2222 | val = ucontrol->value.enumerated.item[0]; | 2243 | val = ucontrol->value.enumerated.item[0]; |
@@ -2250,7 +2271,7 @@ static int hdsp_ad_gain(struct hdsp *hdsp) | |||
2250 | case HDSP_ADGainLowGain: | 2271 | case HDSP_ADGainLowGain: |
2251 | return 2; | 2272 | return 2; |
2252 | default: | 2273 | default: |
2253 | return 1; | 2274 | return 1; |
2254 | } | 2275 | } |
2255 | } | 2276 | } |
2256 | 2277 | ||
@@ -2262,11 +2283,11 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode) | |||
2262 | hdsp->control_register |= HDSP_ADGainMinus10dBV; | 2283 | hdsp->control_register |= HDSP_ADGainMinus10dBV; |
2263 | break; | 2284 | break; |
2264 | case 1: | 2285 | case 1: |
2265 | hdsp->control_register |= HDSP_ADGainPlus4dBu; | 2286 | hdsp->control_register |= HDSP_ADGainPlus4dBu; |
2266 | break; | 2287 | break; |
2267 | case 2: | 2288 | case 2: |
2268 | hdsp->control_register |= HDSP_ADGainLowGain; | 2289 | hdsp->control_register |= HDSP_ADGainLowGain; |
2269 | break; | 2290 | break; |
2270 | default: | 2291 | default: |
2271 | return -1; | 2292 | return -1; |
2272 | 2293 | ||
@@ -2278,7 +2299,7 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode) | |||
2278 | static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 2299 | static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
2279 | { | 2300 | { |
2280 | static char *texts[] = {"-10 dBV", "+4 dBu", "Lo Gain"}; | 2301 | static char *texts[] = {"-10 dBV", "+4 dBu", "Lo Gain"}; |
2281 | 2302 | ||
2282 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2303 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2283 | uinfo->count = 1; | 2304 | uinfo->count = 1; |
2284 | uinfo->value.enumerated.items = 3; | 2305 | uinfo->value.enumerated.items = 3; |
@@ -2291,7 +2312,7 @@ static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
2291 | static int snd_hdsp_get_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2312 | static int snd_hdsp_get_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2292 | { | 2313 | { |
2293 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2314 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2294 | 2315 | ||
2295 | ucontrol->value.enumerated.item[0] = hdsp_ad_gain(hdsp); | 2316 | ucontrol->value.enumerated.item[0] = hdsp_ad_gain(hdsp); |
2296 | return 0; | 2317 | return 0; |
2297 | } | 2318 | } |
@@ -2301,7 +2322,7 @@ static int snd_hdsp_put_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
2301 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2322 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2302 | int change; | 2323 | int change; |
2303 | int val; | 2324 | int val; |
2304 | 2325 | ||
2305 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2326 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2306 | return -EBUSY; | 2327 | return -EBUSY; |
2307 | val = ucontrol->value.enumerated.item[0]; | 2328 | val = ucontrol->value.enumerated.item[0]; |
@@ -2335,7 +2356,7 @@ static int hdsp_phone_gain(struct hdsp *hdsp) | |||
2335 | case HDSP_PhoneGainMinus12dB: | 2356 | case HDSP_PhoneGainMinus12dB: |
2336 | return 2; | 2357 | return 2; |
2337 | default: | 2358 | default: |
2338 | return 0; | 2359 | return 0; |
2339 | } | 2360 | } |
2340 | } | 2361 | } |
2341 | 2362 | ||
@@ -2347,11 +2368,11 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode) | |||
2347 | hdsp->control_register |= HDSP_PhoneGain0dB; | 2368 | hdsp->control_register |= HDSP_PhoneGain0dB; |
2348 | break; | 2369 | break; |
2349 | case 1: | 2370 | case 1: |
2350 | hdsp->control_register |= HDSP_PhoneGainMinus6dB; | 2371 | hdsp->control_register |= HDSP_PhoneGainMinus6dB; |
2351 | break; | 2372 | break; |
2352 | case 2: | 2373 | case 2: |
2353 | hdsp->control_register |= HDSP_PhoneGainMinus12dB; | 2374 | hdsp->control_register |= HDSP_PhoneGainMinus12dB; |
2354 | break; | 2375 | break; |
2355 | default: | 2376 | default: |
2356 | return -1; | 2377 | return -1; |
2357 | 2378 | ||
@@ -2363,7 +2384,7 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode) | |||
2363 | static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 2384 | static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
2364 | { | 2385 | { |
2365 | static char *texts[] = {"0 dB", "-6 dB", "-12 dB"}; | 2386 | static char *texts[] = {"0 dB", "-6 dB", "-12 dB"}; |
2366 | 2387 | ||
2367 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2388 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2368 | uinfo->count = 1; | 2389 | uinfo->count = 1; |
2369 | uinfo->value.enumerated.items = 3; | 2390 | uinfo->value.enumerated.items = 3; |
@@ -2376,7 +2397,7 @@ static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ct | |||
2376 | static int snd_hdsp_get_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2397 | static int snd_hdsp_get_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2377 | { | 2398 | { |
2378 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2399 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2379 | 2400 | ||
2380 | ucontrol->value.enumerated.item[0] = hdsp_phone_gain(hdsp); | 2401 | ucontrol->value.enumerated.item[0] = hdsp_phone_gain(hdsp); |
2381 | return 0; | 2402 | return 0; |
2382 | } | 2403 | } |
@@ -2386,7 +2407,7 @@ static int snd_hdsp_put_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
2386 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2407 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2387 | int change; | 2408 | int change; |
2388 | int val; | 2409 | int val; |
2389 | 2410 | ||
2390 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2411 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2391 | return -EBUSY; | 2412 | return -EBUSY; |
2392 | val = ucontrol->value.enumerated.item[0]; | 2413 | val = ucontrol->value.enumerated.item[0]; |
@@ -2432,7 +2453,7 @@ static int hdsp_set_xlr_breakout_cable(struct hdsp *hdsp, int mode) | |||
2432 | static int snd_hdsp_get_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2453 | static int snd_hdsp_get_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2433 | { | 2454 | { |
2434 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2455 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2435 | 2456 | ||
2436 | ucontrol->value.enumerated.item[0] = hdsp_xlr_breakout_cable(hdsp); | 2457 | ucontrol->value.enumerated.item[0] = hdsp_xlr_breakout_cable(hdsp); |
2437 | return 0; | 2458 | return 0; |
2438 | } | 2459 | } |
@@ -2442,7 +2463,7 @@ static int snd_hdsp_put_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct | |||
2442 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2463 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2443 | int change; | 2464 | int change; |
2444 | int val; | 2465 | int val; |
2445 | 2466 | ||
2446 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2467 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2447 | return -EBUSY; | 2468 | return -EBUSY; |
2448 | val = ucontrol->value.integer.value[0] & 1; | 2469 | val = ucontrol->value.integer.value[0] & 1; |
@@ -2488,7 +2509,7 @@ static int hdsp_set_aeb(struct hdsp *hdsp, int mode) | |||
2488 | static int snd_hdsp_get_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2509 | static int snd_hdsp_get_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2489 | { | 2510 | { |
2490 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2511 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2491 | 2512 | ||
2492 | ucontrol->value.enumerated.item[0] = hdsp_aeb(hdsp); | 2513 | ucontrol->value.enumerated.item[0] = hdsp_aeb(hdsp); |
2493 | return 0; | 2514 | return 0; |
2494 | } | 2515 | } |
@@ -2498,7 +2519,7 @@ static int snd_hdsp_put_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
2498 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2519 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2499 | int change; | 2520 | int change; |
2500 | int val; | 2521 | int val; |
2501 | 2522 | ||
2502 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2523 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2503 | return -EBUSY; | 2524 | return -EBUSY; |
2504 | val = ucontrol->value.integer.value[0] & 1; | 2525 | val = ucontrol->value.integer.value[0] & 1; |
@@ -2576,7 +2597,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd | |||
2576 | { | 2597 | { |
2577 | static char *texts[] = {"Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3" }; | 2598 | static char *texts[] = {"Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3" }; |
2578 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2599 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2579 | 2600 | ||
2580 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2601 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2581 | uinfo->count = 1; | 2602 | uinfo->count = 1; |
2582 | 2603 | ||
@@ -2595,7 +2616,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd | |||
2595 | uinfo->value.enumerated.items = 0; | 2616 | uinfo->value.enumerated.items = 0; |
2596 | break; | 2617 | break; |
2597 | } | 2618 | } |
2598 | 2619 | ||
2599 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) | 2620 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) |
2600 | uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; | 2621 | uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; |
2601 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); | 2622 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); |
@@ -2605,7 +2626,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd | |||
2605 | static int snd_hdsp_get_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2626 | static int snd_hdsp_get_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2606 | { | 2627 | { |
2607 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2628 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2608 | 2629 | ||
2609 | ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp); | 2630 | ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp); |
2610 | return 0; | 2631 | return 0; |
2611 | } | 2632 | } |
@@ -2615,7 +2636,7 @@ static int snd_hdsp_put_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ | |||
2615 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2636 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2616 | int change, max; | 2637 | int change, max; |
2617 | unsigned int val; | 2638 | unsigned int val; |
2618 | 2639 | ||
2619 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2640 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2620 | return -EBUSY; | 2641 | return -EBUSY; |
2621 | 2642 | ||
@@ -2664,7 +2685,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp) | |||
2664 | case HDSP_SelSyncRef_SPDIF: | 2685 | case HDSP_SelSyncRef_SPDIF: |
2665 | return HDSP_AUTOSYNC_FROM_SPDIF; | 2686 | return HDSP_AUTOSYNC_FROM_SPDIF; |
2666 | case HDSP_SelSyncRefMask: | 2687 | case HDSP_SelSyncRefMask: |
2667 | return HDSP_AUTOSYNC_FROM_NONE; | 2688 | return HDSP_AUTOSYNC_FROM_NONE; |
2668 | case HDSP_SelSyncRef_ADAT1: | 2689 | case HDSP_SelSyncRef_ADAT1: |
2669 | return HDSP_AUTOSYNC_FROM_ADAT1; | 2690 | return HDSP_AUTOSYNC_FROM_ADAT1; |
2670 | case HDSP_SelSyncRef_ADAT2: | 2691 | case HDSP_SelSyncRef_ADAT2: |
@@ -2680,7 +2701,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp) | |||
2680 | static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 2701 | static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
2681 | { | 2702 | { |
2682 | static char *texts[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" }; | 2703 | static char *texts[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" }; |
2683 | 2704 | ||
2684 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2705 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2685 | uinfo->count = 1; | 2706 | uinfo->count = 1; |
2686 | uinfo->value.enumerated.items = 7; | 2707 | uinfo->value.enumerated.items = 7; |
@@ -2693,7 +2714,7 @@ static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ | |||
2693 | static int snd_hdsp_get_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2714 | static int snd_hdsp_get_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2694 | { | 2715 | { |
2695 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2716 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2696 | 2717 | ||
2697 | ucontrol->value.enumerated.item[0] = hdsp_autosync_ref(hdsp); | 2718 | ucontrol->value.enumerated.item[0] = hdsp_autosync_ref(hdsp); |
2698 | return 0; | 2719 | return 0; |
2699 | } | 2720 | } |
@@ -2727,7 +2748,7 @@ static int hdsp_set_line_output(struct hdsp *hdsp, int out) | |||
2727 | static int snd_hdsp_get_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2748 | static int snd_hdsp_get_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2728 | { | 2749 | { |
2729 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2750 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2730 | 2751 | ||
2731 | spin_lock_irq(&hdsp->lock); | 2752 | spin_lock_irq(&hdsp->lock); |
2732 | ucontrol->value.integer.value[0] = hdsp_line_out(hdsp); | 2753 | ucontrol->value.integer.value[0] = hdsp_line_out(hdsp); |
2733 | spin_unlock_irq(&hdsp->lock); | 2754 | spin_unlock_irq(&hdsp->lock); |
@@ -2739,7 +2760,7 @@ static int snd_hdsp_put_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
2739 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2760 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2740 | int change; | 2761 | int change; |
2741 | unsigned int val; | 2762 | unsigned int val; |
2742 | 2763 | ||
2743 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2764 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2744 | return -EBUSY; | 2765 | return -EBUSY; |
2745 | val = ucontrol->value.integer.value[0] & 1; | 2766 | val = ucontrol->value.integer.value[0] & 1; |
@@ -2773,7 +2794,7 @@ static int hdsp_set_precise_pointer(struct hdsp *hdsp, int precise) | |||
2773 | static int snd_hdsp_get_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2794 | static int snd_hdsp_get_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2774 | { | 2795 | { |
2775 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2796 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2776 | 2797 | ||
2777 | spin_lock_irq(&hdsp->lock); | 2798 | spin_lock_irq(&hdsp->lock); |
2778 | ucontrol->value.integer.value[0] = hdsp->precise_ptr; | 2799 | ucontrol->value.integer.value[0] = hdsp->precise_ptr; |
2779 | spin_unlock_irq(&hdsp->lock); | 2800 | spin_unlock_irq(&hdsp->lock); |
@@ -2785,7 +2806,7 @@ static int snd_hdsp_put_precise_pointer(struct snd_kcontrol *kcontrol, struct sn | |||
2785 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2806 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2786 | int change; | 2807 | int change; |
2787 | unsigned int val; | 2808 | unsigned int val; |
2788 | 2809 | ||
2789 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2810 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2790 | return -EBUSY; | 2811 | return -EBUSY; |
2791 | val = ucontrol->value.integer.value[0] & 1; | 2812 | val = ucontrol->value.integer.value[0] & 1; |
@@ -2819,7 +2840,7 @@ static int hdsp_set_use_midi_tasklet(struct hdsp *hdsp, int use_tasklet) | |||
2819 | static int snd_hdsp_get_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 2840 | static int snd_hdsp_get_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
2820 | { | 2841 | { |
2821 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2842 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2822 | 2843 | ||
2823 | spin_lock_irq(&hdsp->lock); | 2844 | spin_lock_irq(&hdsp->lock); |
2824 | ucontrol->value.integer.value[0] = hdsp->use_midi_tasklet; | 2845 | ucontrol->value.integer.value[0] = hdsp->use_midi_tasklet; |
2825 | spin_unlock_irq(&hdsp->lock); | 2846 | spin_unlock_irq(&hdsp->lock); |
@@ -2831,7 +2852,7 @@ static int snd_hdsp_put_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct s | |||
2831 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 2852 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
2832 | int change; | 2853 | int change; |
2833 | unsigned int val; | 2854 | unsigned int val; |
2834 | 2855 | ||
2835 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 2856 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
2836 | return -EBUSY; | 2857 | return -EBUSY; |
2837 | val = ucontrol->value.integer.value[0] & 1; | 2858 | val = ucontrol->value.integer.value[0] & 1; |
@@ -2873,12 +2894,12 @@ static int snd_hdsp_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
2873 | 2894 | ||
2874 | source = ucontrol->value.integer.value[0]; | 2895 | source = ucontrol->value.integer.value[0]; |
2875 | destination = ucontrol->value.integer.value[1]; | 2896 | destination = ucontrol->value.integer.value[1]; |
2876 | 2897 | ||
2877 | if (source >= hdsp->max_channels) | 2898 | if (source >= hdsp->max_channels) |
2878 | addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination); | 2899 | addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination); |
2879 | else | 2900 | else |
2880 | addr = hdsp_input_to_output_key(hdsp,source, destination); | 2901 | addr = hdsp_input_to_output_key(hdsp,source, destination); |
2881 | 2902 | ||
2882 | spin_lock_irq(&hdsp->lock); | 2903 | spin_lock_irq(&hdsp->lock); |
2883 | ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr); | 2904 | ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr); |
2884 | spin_unlock_irq(&hdsp->lock); | 2905 | spin_unlock_irq(&hdsp->lock); |
@@ -2926,7 +2947,7 @@ static int snd_hdsp_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
2926 | 2947 | ||
2927 | static int snd_hdsp_info_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 2948 | static int snd_hdsp_info_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
2928 | { | 2949 | { |
2929 | static char *texts[] = {"No Lock", "Lock", "Sync" }; | 2950 | static char *texts[] = {"No Lock", "Lock", "Sync" }; |
2930 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2951 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
2931 | uinfo->count = 1; | 2952 | uinfo->count = 1; |
2932 | uinfo->value.enumerated.items = 3; | 2953 | uinfo->value.enumerated.items = 3; |
@@ -2971,7 +2992,7 @@ static int hdsp_spdif_sync_check(struct hdsp *hdsp) | |||
2971 | int status = hdsp_read(hdsp, HDSP_statusRegister); | 2992 | int status = hdsp_read(hdsp, HDSP_statusRegister); |
2972 | if (status & HDSP_SPDIFErrorFlag) | 2993 | if (status & HDSP_SPDIFErrorFlag) |
2973 | return 0; | 2994 | return 0; |
2974 | else { | 2995 | else { |
2975 | if (status & HDSP_SPDIFSync) | 2996 | if (status & HDSP_SPDIFSync) |
2976 | return 2; | 2997 | return 2; |
2977 | else | 2998 | else |
@@ -3007,7 +3028,7 @@ static int hdsp_adatsync_sync_check(struct hdsp *hdsp) | |||
3007 | return 1; | 3028 | return 1; |
3008 | } else | 3029 | } else |
3009 | return 0; | 3030 | return 0; |
3010 | } | 3031 | } |
3011 | 3032 | ||
3012 | static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 3033 | static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
3013 | { | 3034 | { |
@@ -3025,17 +3046,17 @@ static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struc | |||
3025 | } | 3046 | } |
3026 | 3047 | ||
3027 | static int hdsp_adat_sync_check(struct hdsp *hdsp, int idx) | 3048 | static int hdsp_adat_sync_check(struct hdsp *hdsp, int idx) |
3028 | { | 3049 | { |
3029 | int status = hdsp_read(hdsp, HDSP_statusRegister); | 3050 | int status = hdsp_read(hdsp, HDSP_statusRegister); |
3030 | 3051 | ||
3031 | if (status & (HDSP_Lock0>>idx)) { | 3052 | if (status & (HDSP_Lock0>>idx)) { |
3032 | if (status & (HDSP_Sync0>>idx)) | 3053 | if (status & (HDSP_Sync0>>idx)) |
3033 | return 2; | 3054 | return 2; |
3034 | else | 3055 | else |
3035 | return 1; | 3056 | return 1; |
3036 | } else | 3057 | } else |
3037 | return 0; | 3058 | return 0; |
3038 | } | 3059 | } |
3039 | 3060 | ||
3040 | static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 3061 | static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
3041 | { | 3062 | { |
@@ -3053,7 +3074,7 @@ static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct sn | |||
3053 | break; | 3074 | break; |
3054 | case Multiface: | 3075 | case Multiface: |
3055 | case H9632: | 3076 | case H9632: |
3056 | if (offset >= 1) | 3077 | if (offset >= 1) |
3057 | return -EINVAL; | 3078 | return -EINVAL; |
3058 | break; | 3079 | break; |
3059 | default: | 3080 | default: |
@@ -3115,7 +3136,7 @@ static int snd_hdsp_info_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ct | |||
3115 | static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 3136 | static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
3116 | { | 3137 | { |
3117 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 3138 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
3118 | 3139 | ||
3119 | ucontrol->value.enumerated.item[0] = hdsp_dds_offset(hdsp); | 3140 | ucontrol->value.enumerated.item[0] = hdsp_dds_offset(hdsp); |
3120 | return 0; | 3141 | return 0; |
3121 | } | 3142 | } |
@@ -3125,7 +3146,7 @@ static int snd_hdsp_put_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
3125 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); | 3146 | struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); |
3126 | int change; | 3147 | int change; |
3127 | int val; | 3148 | int val; |
3128 | 3149 | ||
3129 | if (!snd_hdsp_use_is_exclusive(hdsp)) | 3150 | if (!snd_hdsp_use_is_exclusive(hdsp)) |
3130 | return -EBUSY; | 3151 | return -EBUSY; |
3131 | val = ucontrol->value.enumerated.item[0]; | 3152 | val = ucontrol->value.enumerated.item[0]; |
@@ -3170,7 +3191,7 @@ static struct snd_kcontrol_new snd_hdsp_controls[] = { | |||
3170 | .get = snd_hdsp_control_spdif_mask_get, | 3191 | .get = snd_hdsp_control_spdif_mask_get, |
3171 | .private_value = IEC958_AES0_NONAUDIO | | 3192 | .private_value = IEC958_AES0_NONAUDIO | |
3172 | IEC958_AES0_PROFESSIONAL | | 3193 | IEC958_AES0_PROFESSIONAL | |
3173 | IEC958_AES0_CON_EMPHASIS, | 3194 | IEC958_AES0_CON_EMPHASIS, |
3174 | }, | 3195 | }, |
3175 | { | 3196 | { |
3176 | .access = SNDRV_CTL_ELEM_ACCESS_READ, | 3197 | .access = SNDRV_CTL_ELEM_ACCESS_READ, |
@@ -3188,7 +3209,7 @@ HDSP_SPDIF_OUT("IEC958 Output also on ADAT1", 0), | |||
3188 | HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0), | 3209 | HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0), |
3189 | HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0), | 3210 | HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0), |
3190 | HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0), | 3211 | HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0), |
3191 | /* 'Sample Clock Source' complies with the alsa control naming scheme */ | 3212 | /* 'Sample Clock Source' complies with the alsa control naming scheme */ |
3192 | HDSP_CLOCK_SOURCE("Sample Clock Source", 0), | 3213 | HDSP_CLOCK_SOURCE("Sample Clock Source", 0), |
3193 | { | 3214 | { |
3194 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 3215 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -3240,7 +3261,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp) | |||
3240 | return err; | 3261 | return err; |
3241 | } | 3262 | } |
3242 | } | 3263 | } |
3243 | 3264 | ||
3244 | /* DA, AD and Phone gain and XLR breakout cable controls for H9632 cards */ | 3265 | /* DA, AD and Phone gain and XLR breakout cable controls for H9632 cards */ |
3245 | if (hdsp->io_type == H9632) { | 3266 | if (hdsp->io_type == H9632) { |
3246 | for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_9632_controls); idx++) { | 3267 | for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_9632_controls); idx++) { |
@@ -3259,7 +3280,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp) | |||
3259 | } | 3280 | } |
3260 | 3281 | ||
3261 | /*------------------------------------------------------------ | 3282 | /*------------------------------------------------------------ |
3262 | /proc interface | 3283 | /proc interface |
3263 | ------------------------------------------------------------*/ | 3284 | ------------------------------------------------------------*/ |
3264 | 3285 | ||
3265 | static void | 3286 | static void |
@@ -3298,7 +3319,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3298 | } | 3319 | } |
3299 | } | 3320 | } |
3300 | } | 3321 | } |
3301 | 3322 | ||
3302 | status = hdsp_read(hdsp, HDSP_statusRegister); | 3323 | status = hdsp_read(hdsp, HDSP_statusRegister); |
3303 | status2 = hdsp_read(hdsp, HDSP_status2Register); | 3324 | status2 = hdsp_read(hdsp, HDSP_status2Register); |
3304 | 3325 | ||
@@ -3362,17 +3383,17 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3362 | break; | 3383 | break; |
3363 | case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ: | 3384 | case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ: |
3364 | clock_source = "Internal 192 kHz"; | 3385 | clock_source = "Internal 192 kHz"; |
3365 | break; | 3386 | break; |
3366 | default: | 3387 | default: |
3367 | clock_source = "Error"; | 3388 | clock_source = "Error"; |
3368 | } | 3389 | } |
3369 | snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source); | 3390 | snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source); |
3370 | 3391 | ||
3371 | if (hdsp_system_clock_mode(hdsp)) | 3392 | if (hdsp_system_clock_mode(hdsp)) |
3372 | system_clock_mode = "Slave"; | 3393 | system_clock_mode = "Slave"; |
3373 | else | 3394 | else |
3374 | system_clock_mode = "Master"; | 3395 | system_clock_mode = "Master"; |
3375 | 3396 | ||
3376 | switch (hdsp_pref_sync_ref (hdsp)) { | 3397 | switch (hdsp_pref_sync_ref (hdsp)) { |
3377 | case HDSP_SYNC_FROM_WORD: | 3398 | case HDSP_SYNC_FROM_WORD: |
3378 | pref_sync_ref = "Word Clock"; | 3399 | pref_sync_ref = "Word Clock"; |
@@ -3397,7 +3418,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3397 | break; | 3418 | break; |
3398 | } | 3419 | } |
3399 | snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref); | 3420 | snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref); |
3400 | 3421 | ||
3401 | switch (hdsp_autosync_ref (hdsp)) { | 3422 | switch (hdsp_autosync_ref (hdsp)) { |
3402 | case HDSP_AUTOSYNC_FROM_WORD: | 3423 | case HDSP_AUTOSYNC_FROM_WORD: |
3403 | autosync_ref = "Word Clock"; | 3424 | autosync_ref = "Word Clock"; |
@@ -3410,7 +3431,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3410 | break; | 3431 | break; |
3411 | case HDSP_AUTOSYNC_FROM_NONE: | 3432 | case HDSP_AUTOSYNC_FROM_NONE: |
3412 | autosync_ref = "None"; | 3433 | autosync_ref = "None"; |
3413 | break; | 3434 | break; |
3414 | case HDSP_AUTOSYNC_FROM_ADAT1: | 3435 | case HDSP_AUTOSYNC_FROM_ADAT1: |
3415 | autosync_ref = "ADAT1"; | 3436 | autosync_ref = "ADAT1"; |
3416 | break; | 3437 | break; |
@@ -3425,14 +3446,14 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3425 | break; | 3446 | break; |
3426 | } | 3447 | } |
3427 | snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref); | 3448 | snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref); |
3428 | 3449 | ||
3429 | snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp)); | 3450 | snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp)); |
3430 | 3451 | ||
3431 | snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode); | 3452 | snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode); |
3432 | 3453 | ||
3433 | snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate); | 3454 | snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate); |
3434 | snd_iprintf (buffer, "System Clock Locked: %s\n", hdsp->clock_source_locked ? "Yes" : "No"); | 3455 | snd_iprintf (buffer, "System Clock Locked: %s\n", hdsp->clock_source_locked ? "Yes" : "No"); |
3435 | 3456 | ||
3436 | snd_iprintf(buffer, "\n"); | 3457 | snd_iprintf(buffer, "\n"); |
3437 | 3458 | ||
3438 | switch (hdsp_spdif_in(hdsp)) { | 3459 | switch (hdsp_spdif_in(hdsp)) { |
@@ -3452,7 +3473,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3452 | snd_iprintf(buffer, "IEC958 input: ???\n"); | 3473 | snd_iprintf(buffer, "IEC958 input: ???\n"); |
3453 | break; | 3474 | break; |
3454 | } | 3475 | } |
3455 | 3476 | ||
3456 | if (hdsp->control_register & HDSP_SPDIFOpticalOut) | 3477 | if (hdsp->control_register & HDSP_SPDIFOpticalOut) |
3457 | snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n"); | 3478 | snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n"); |
3458 | else | 3479 | else |
@@ -3510,13 +3531,13 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3510 | snd_iprintf (buffer, "SPDIF: No Lock\n"); | 3531 | snd_iprintf (buffer, "SPDIF: No Lock\n"); |
3511 | else | 3532 | else |
3512 | snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock"); | 3533 | snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock"); |
3513 | 3534 | ||
3514 | x = status2 & HDSP_wc_sync; | 3535 | x = status2 & HDSP_wc_sync; |
3515 | if (status2 & HDSP_wc_lock) | 3536 | if (status2 & HDSP_wc_lock) |
3516 | snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock"); | 3537 | snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock"); |
3517 | else | 3538 | else |
3518 | snd_iprintf (buffer, "Word Clock: No Lock\n"); | 3539 | snd_iprintf (buffer, "Word Clock: No Lock\n"); |
3519 | 3540 | ||
3520 | x = status & HDSP_TimecodeSync; | 3541 | x = status & HDSP_TimecodeSync; |
3521 | if (status & HDSP_TimecodeLock) | 3542 | if (status & HDSP_TimecodeLock) |
3522 | snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock"); | 3543 | snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock"); |
@@ -3524,11 +3545,11 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3524 | snd_iprintf(buffer, "ADAT Sync: No Lock\n"); | 3545 | snd_iprintf(buffer, "ADAT Sync: No Lock\n"); |
3525 | 3546 | ||
3526 | snd_iprintf(buffer, "\n"); | 3547 | snd_iprintf(buffer, "\n"); |
3527 | 3548 | ||
3528 | /* Informations about H9632 specific controls */ | 3549 | /* Informations about H9632 specific controls */ |
3529 | if (hdsp->io_type == H9632) { | 3550 | if (hdsp->io_type == H9632) { |
3530 | char *tmp; | 3551 | char *tmp; |
3531 | 3552 | ||
3532 | switch (hdsp_ad_gain(hdsp)) { | 3553 | switch (hdsp_ad_gain(hdsp)) { |
3533 | case 0: | 3554 | case 0: |
3534 | tmp = "-10 dBV"; | 3555 | tmp = "-10 dBV"; |
@@ -3554,7 +3575,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3554 | break; | 3575 | break; |
3555 | } | 3576 | } |
3556 | snd_iprintf(buffer, "DA Gain : %s\n", tmp); | 3577 | snd_iprintf(buffer, "DA Gain : %s\n", tmp); |
3557 | 3578 | ||
3558 | switch (hdsp_phone_gain(hdsp)) { | 3579 | switch (hdsp_phone_gain(hdsp)) { |
3559 | case 0: | 3580 | case 0: |
3560 | tmp = "0 dB"; | 3581 | tmp = "0 dB"; |
@@ -3568,8 +3589,8 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | |||
3568 | } | 3589 | } |
3569 | snd_iprintf(buffer, "Phones Gain : %s\n", tmp); | 3590 | snd_iprintf(buffer, "Phones Gain : %s\n", tmp); |
3570 | 3591 | ||
3571 | snd_iprintf(buffer, "XLR Breakout Cable : %s\n", hdsp_xlr_breakout_cable(hdsp) ? "yes" : "no"); | 3592 | snd_iprintf(buffer, "XLR Breakout Cable : %s\n", hdsp_xlr_breakout_cable(hdsp) ? "yes" : "no"); |
3572 | 3593 | ||
3573 | if (hdsp->control_register & HDSP_AnalogExtensionBoard) | 3594 | if (hdsp->control_register & HDSP_AnalogExtensionBoard) |
3574 | snd_iprintf(buffer, "AEB : on (ADAT1 internal)\n"); | 3595 | snd_iprintf(buffer, "AEB : on (ADAT1 internal)\n"); |
3575 | else | 3596 | else |
@@ -3632,18 +3653,18 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) | |||
3632 | 3653 | ||
3633 | /* set defaults: | 3654 | /* set defaults: |
3634 | 3655 | ||
3635 | SPDIF Input via Coax | 3656 | SPDIF Input via Coax |
3636 | Master clock mode | 3657 | Master clock mode |
3637 | maximum latency (7 => 2^7 = 8192 samples, 64Kbyte buffer, | 3658 | maximum latency (7 => 2^7 = 8192 samples, 64Kbyte buffer, |
3638 | which implies 2 4096 sample, 32Kbyte periods). | 3659 | which implies 2 4096 sample, 32Kbyte periods). |
3639 | Enable line out. | 3660 | Enable line out. |
3640 | */ | 3661 | */ |
3641 | 3662 | ||
3642 | hdsp->control_register = HDSP_ClockModeMaster | | 3663 | hdsp->control_register = HDSP_ClockModeMaster | |
3643 | HDSP_SPDIFInputCoaxial | | 3664 | HDSP_SPDIFInputCoaxial | |
3644 | hdsp_encode_latency(7) | | 3665 | hdsp_encode_latency(7) | |
3645 | HDSP_LineOut; | 3666 | HDSP_LineOut; |
3646 | 3667 | ||
3647 | 3668 | ||
3648 | hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); | 3669 | hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); |
3649 | 3670 | ||
@@ -3661,7 +3682,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) | |||
3661 | hdsp_compute_period_size(hdsp); | 3682 | hdsp_compute_period_size(hdsp); |
3662 | 3683 | ||
3663 | /* silence everything */ | 3684 | /* silence everything */ |
3664 | 3685 | ||
3665 | for (i = 0; i < HDSP_MATRIX_MIXER_SIZE; ++i) | 3686 | for (i = 0; i < HDSP_MATRIX_MIXER_SIZE; ++i) |
3666 | hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN; | 3687 | hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN; |
3667 | 3688 | ||
@@ -3669,7 +3690,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) | |||
3669 | if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN)) | 3690 | if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN)) |
3670 | return -EIO; | 3691 | return -EIO; |
3671 | } | 3692 | } |
3672 | 3693 | ||
3673 | /* H9632 specific defaults */ | 3694 | /* H9632 specific defaults */ |
3674 | if (hdsp->io_type == H9632) { | 3695 | if (hdsp->io_type == H9632) { |
3675 | hdsp->control_register |= (HDSP_DAGainPlus4dBu | HDSP_ADGainPlus4dBu | HDSP_PhoneGain0dB); | 3696 | hdsp->control_register |= (HDSP_DAGainPlus4dBu | HDSP_ADGainPlus4dBu | HDSP_PhoneGain0dB); |
@@ -3687,12 +3708,12 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) | |||
3687 | static void hdsp_midi_tasklet(unsigned long arg) | 3708 | static void hdsp_midi_tasklet(unsigned long arg) |
3688 | { | 3709 | { |
3689 | struct hdsp *hdsp = (struct hdsp *)arg; | 3710 | struct hdsp *hdsp = (struct hdsp *)arg; |
3690 | 3711 | ||
3691 | if (hdsp->midi[0].pending) | 3712 | if (hdsp->midi[0].pending) |
3692 | snd_hdsp_midi_input_read (&hdsp->midi[0]); | 3713 | snd_hdsp_midi_input_read (&hdsp->midi[0]); |
3693 | if (hdsp->midi[1].pending) | 3714 | if (hdsp->midi[1].pending) |
3694 | snd_hdsp_midi_input_read (&hdsp->midi[1]); | 3715 | snd_hdsp_midi_input_read (&hdsp->midi[1]); |
3695 | } | 3716 | } |
3696 | 3717 | ||
3697 | static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) | 3718 | static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) |
3698 | { | 3719 | { |
@@ -3704,7 +3725,7 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) | |||
3704 | unsigned int midi0status; | 3725 | unsigned int midi0status; |
3705 | unsigned int midi1status; | 3726 | unsigned int midi1status; |
3706 | int schedule = 0; | 3727 | int schedule = 0; |
3707 | 3728 | ||
3708 | status = hdsp_read(hdsp, HDSP_statusRegister); | 3729 | status = hdsp_read(hdsp, HDSP_statusRegister); |
3709 | 3730 | ||
3710 | audio = status & HDSP_audioIRQPending; | 3731 | audio = status & HDSP_audioIRQPending; |
@@ -3718,15 +3739,18 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) | |||
3718 | 3739 | ||
3719 | midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff; | 3740 | midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff; |
3720 | midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff; | 3741 | midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff; |
3721 | 3742 | ||
3743 | if (!(hdsp->state & HDSP_InitializationComplete)) | ||
3744 | return IRQ_HANDLED; | ||
3745 | |||
3722 | if (audio) { | 3746 | if (audio) { |
3723 | if (hdsp->capture_substream) | 3747 | if (hdsp->capture_substream) |
3724 | snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); | 3748 | snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); |
3725 | 3749 | ||
3726 | if (hdsp->playback_substream) | 3750 | if (hdsp->playback_substream) |
3727 | snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); | 3751 | snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); |
3728 | } | 3752 | } |
3729 | 3753 | ||
3730 | if (midi0 && midi0status) { | 3754 | if (midi0 && midi0status) { |
3731 | if (hdsp->use_midi_tasklet) { | 3755 | if (hdsp->use_midi_tasklet) { |
3732 | /* we disable interrupts for this input until processing is done */ | 3756 | /* we disable interrupts for this input until processing is done */ |
@@ -3769,10 +3793,10 @@ static char *hdsp_channel_buffer_location(struct hdsp *hdsp, | |||
3769 | 3793 | ||
3770 | if (snd_BUG_ON(channel < 0 || channel >= hdsp->max_channels)) | 3794 | if (snd_BUG_ON(channel < 0 || channel >= hdsp->max_channels)) |
3771 | return NULL; | 3795 | return NULL; |
3772 | 3796 | ||
3773 | if ((mapped_channel = hdsp->channel_map[channel]) < 0) | 3797 | if ((mapped_channel = hdsp->channel_map[channel]) < 0) |
3774 | return NULL; | 3798 | return NULL; |
3775 | 3799 | ||
3776 | if (stream == SNDRV_PCM_STREAM_CAPTURE) | 3800 | if (stream == SNDRV_PCM_STREAM_CAPTURE) |
3777 | return hdsp->capture_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES); | 3801 | return hdsp->capture_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES); |
3778 | else | 3802 | else |
@@ -3965,7 +3989,7 @@ static int snd_hdsp_trigger(struct snd_pcm_substream *substream, int cmd) | |||
3965 | struct hdsp *hdsp = snd_pcm_substream_chip(substream); | 3989 | struct hdsp *hdsp = snd_pcm_substream_chip(substream); |
3966 | struct snd_pcm_substream *other; | 3990 | struct snd_pcm_substream *other; |
3967 | int running; | 3991 | int running; |
3968 | 3992 | ||
3969 | if (hdsp_check_for_iobox (hdsp)) | 3993 | if (hdsp_check_for_iobox (hdsp)) |
3970 | return -EIO; | 3994 | return -EIO; |
3971 | 3995 | ||
@@ -4059,10 +4083,10 @@ static struct snd_pcm_hardware snd_hdsp_playback_subinfo = | |||
4059 | .formats = SNDRV_PCM_FMTBIT_S32_LE, | 4083 | .formats = SNDRV_PCM_FMTBIT_S32_LE, |
4060 | #endif | 4084 | #endif |
4061 | .rates = (SNDRV_PCM_RATE_32000 | | 4085 | .rates = (SNDRV_PCM_RATE_32000 | |
4062 | SNDRV_PCM_RATE_44100 | | 4086 | SNDRV_PCM_RATE_44100 | |
4063 | SNDRV_PCM_RATE_48000 | | 4087 | SNDRV_PCM_RATE_48000 | |
4064 | SNDRV_PCM_RATE_64000 | | 4088 | SNDRV_PCM_RATE_64000 | |
4065 | SNDRV_PCM_RATE_88200 | | 4089 | SNDRV_PCM_RATE_88200 | |
4066 | SNDRV_PCM_RATE_96000), | 4090 | SNDRV_PCM_RATE_96000), |
4067 | .rate_min = 32000, | 4091 | .rate_min = 32000, |
4068 | .rate_max = 96000, | 4092 | .rate_max = 96000, |
@@ -4088,10 +4112,10 @@ static struct snd_pcm_hardware snd_hdsp_capture_subinfo = | |||
4088 | .formats = SNDRV_PCM_FMTBIT_S32_LE, | 4112 | .formats = SNDRV_PCM_FMTBIT_S32_LE, |
4089 | #endif | 4113 | #endif |
4090 | .rates = (SNDRV_PCM_RATE_32000 | | 4114 | .rates = (SNDRV_PCM_RATE_32000 | |
4091 | SNDRV_PCM_RATE_44100 | | 4115 | SNDRV_PCM_RATE_44100 | |
4092 | SNDRV_PCM_RATE_48000 | | 4116 | SNDRV_PCM_RATE_48000 | |
4093 | SNDRV_PCM_RATE_64000 | | 4117 | SNDRV_PCM_RATE_64000 | |
4094 | SNDRV_PCM_RATE_88200 | | 4118 | SNDRV_PCM_RATE_88200 | |
4095 | SNDRV_PCM_RATE_96000), | 4119 | SNDRV_PCM_RATE_96000), |
4096 | .rate_min = 32000, | 4120 | .rate_min = 32000, |
4097 | .rate_max = 96000, | 4121 | .rate_max = 96000, |
@@ -4170,7 +4194,7 @@ static int snd_hdsp_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params, | |||
4170 | .max = hdsp->qs_in_channels, | 4194 | .max = hdsp->qs_in_channels, |
4171 | .integer = 1, | 4195 | .integer = 1, |
4172 | }; | 4196 | }; |
4173 | return snd_interval_refine(c, &t); | 4197 | return snd_interval_refine(c, &t); |
4174 | } else if (r->min > 48000 && r->max <= 96000) { | 4198 | } else if (r->min > 48000 && r->max <= 96000) { |
4175 | struct snd_interval t = { | 4199 | struct snd_interval t = { |
4176 | .min = hdsp->ds_in_channels, | 4200 | .min = hdsp->ds_in_channels, |
@@ -4201,7 +4225,7 @@ static int snd_hdsp_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params, | |||
4201 | .max = hdsp->qs_out_channels, | 4225 | .max = hdsp->qs_out_channels, |
4202 | .integer = 1, | 4226 | .integer = 1, |
4203 | }; | 4227 | }; |
4204 | return snd_interval_refine(c, &t); | 4228 | return snd_interval_refine(c, &t); |
4205 | } else if (r->min > 48000 && r->max <= 96000) { | 4229 | } else if (r->min > 48000 && r->max <= 96000) { |
4206 | struct snd_interval t = { | 4230 | struct snd_interval t = { |
4207 | .min = hdsp->ds_out_channels, | 4231 | .min = hdsp->ds_out_channels, |
@@ -4318,8 +4342,8 @@ static int snd_hdsp_playback_open(struct snd_pcm_substream *substream) | |||
4318 | if (hdsp->io_type == H9632) { | 4342 | if (hdsp->io_type == H9632) { |
4319 | runtime->hw.channels_min = hdsp->qs_out_channels; | 4343 | runtime->hw.channels_min = hdsp->qs_out_channels; |
4320 | runtime->hw.channels_max = hdsp->ss_out_channels; | 4344 | runtime->hw.channels_max = hdsp->ss_out_channels; |
4321 | } | 4345 | } |
4322 | 4346 | ||
4323 | snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, | 4347 | snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, |
4324 | snd_hdsp_hw_rule_out_channels, hdsp, | 4348 | snd_hdsp_hw_rule_out_channels, hdsp, |
4325 | SNDRV_PCM_HW_PARAM_CHANNELS, -1); | 4349 | SNDRV_PCM_HW_PARAM_CHANNELS, -1); |
@@ -4413,13 +4437,6 @@ static int snd_hdsp_capture_release(struct snd_pcm_substream *substream) | |||
4413 | return 0; | 4437 | return 0; |
4414 | } | 4438 | } |
4415 | 4439 | ||
4416 | static int snd_hdsp_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file) | ||
4417 | { | ||
4418 | /* we have nothing to initialize but the call is required */ | ||
4419 | return 0; | ||
4420 | } | ||
4421 | |||
4422 | |||
4423 | /* helper functions for copying meter values */ | 4440 | /* helper functions for copying meter values */ |
4424 | static inline int copy_u32_le(void __user *dest, void __iomem *src) | 4441 | static inline int copy_u32_le(void __user *dest, void __iomem *src) |
4425 | { | 4442 | { |
@@ -4536,7 +4553,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm | |||
4536 | hdsp->iobase + HDSP_playbackRmsLevel + i * 8 + 4, | 4553 | hdsp->iobase + HDSP_playbackRmsLevel + i * 8 + 4, |
4537 | hdsp->iobase + HDSP_playbackRmsLevel + i * 8)) | 4554 | hdsp->iobase + HDSP_playbackRmsLevel + i * 8)) |
4538 | return -EFAULT; | 4555 | return -EFAULT; |
4539 | if (copy_u64_le(&peak_rms->input_rms[i], | 4556 | if (copy_u64_le(&peak_rms->input_rms[i], |
4540 | hdsp->iobase + HDSP_inputRmsLevel + i * 8 + 4, | 4557 | hdsp->iobase + HDSP_inputRmsLevel + i * 8 + 4, |
4541 | hdsp->iobase + HDSP_inputRmsLevel + i * 8)) | 4558 | hdsp->iobase + HDSP_inputRmsLevel + i * 8)) |
4542 | return -EFAULT; | 4559 | return -EFAULT; |
@@ -4546,7 +4563,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm | |||
4546 | 4563 | ||
4547 | static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg) | 4564 | static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg) |
4548 | { | 4565 | { |
4549 | struct hdsp *hdsp = (struct hdsp *)hw->private_data; | 4566 | struct hdsp *hdsp = (struct hdsp *)hw->private_data; |
4550 | void __user *argp = (void __user *)arg; | 4567 | void __user *argp = (void __user *)arg; |
4551 | int err; | 4568 | int err; |
4552 | 4569 | ||
@@ -4580,7 +4597,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4580 | struct hdsp_config_info info; | 4597 | struct hdsp_config_info info; |
4581 | unsigned long flags; | 4598 | unsigned long flags; |
4582 | int i; | 4599 | int i; |
4583 | 4600 | ||
4584 | err = hdsp_check_for_iobox(hdsp); | 4601 | err = hdsp_check_for_iobox(hdsp); |
4585 | if (err < 0) | 4602 | if (err < 0) |
4586 | return err; | 4603 | return err; |
@@ -4614,7 +4631,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4614 | info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp); | 4631 | info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp); |
4615 | info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp); | 4632 | info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp); |
4616 | info.xlr_breakout_cable = (unsigned char)hdsp_xlr_breakout_cable(hdsp); | 4633 | info.xlr_breakout_cable = (unsigned char)hdsp_xlr_breakout_cable(hdsp); |
4617 | 4634 | ||
4618 | } | 4635 | } |
4619 | if (hdsp->io_type == H9632 || hdsp->io_type == H9652) | 4636 | if (hdsp->io_type == H9632 || hdsp->io_type == H9652) |
4620 | info.analog_extension_board = (unsigned char)hdsp_aeb(hdsp); | 4637 | info.analog_extension_board = (unsigned char)hdsp_aeb(hdsp); |
@@ -4625,7 +4642,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4625 | } | 4642 | } |
4626 | case SNDRV_HDSP_IOCTL_GET_9632_AEB: { | 4643 | case SNDRV_HDSP_IOCTL_GET_9632_AEB: { |
4627 | struct hdsp_9632_aeb h9632_aeb; | 4644 | struct hdsp_9632_aeb h9632_aeb; |
4628 | 4645 | ||
4629 | if (hdsp->io_type != H9632) return -EINVAL; | 4646 | if (hdsp->io_type != H9632) return -EINVAL; |
4630 | h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS; | 4647 | h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS; |
4631 | h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS; | 4648 | h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS; |
@@ -4636,7 +4653,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4636 | case SNDRV_HDSP_IOCTL_GET_VERSION: { | 4653 | case SNDRV_HDSP_IOCTL_GET_VERSION: { |
4637 | struct hdsp_version hdsp_version; | 4654 | struct hdsp_version hdsp_version; |
4638 | int err; | 4655 | int err; |
4639 | 4656 | ||
4640 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; | 4657 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; |
4641 | if (hdsp->io_type == Undefined) { | 4658 | if (hdsp->io_type == Undefined) { |
4642 | if ((err = hdsp_get_iobox_version(hdsp)) < 0) | 4659 | if ((err = hdsp_get_iobox_version(hdsp)) < 0) |
@@ -4652,7 +4669,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4652 | struct hdsp_firmware __user *firmware; | 4669 | struct hdsp_firmware __user *firmware; |
4653 | u32 __user *firmware_data; | 4670 | u32 __user *firmware_data; |
4654 | int err; | 4671 | int err; |
4655 | 4672 | ||
4656 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; | 4673 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; |
4657 | /* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */ | 4674 | /* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */ |
4658 | if (hdsp->io_type == Undefined) return -EINVAL; | 4675 | if (hdsp->io_type == Undefined) return -EINVAL; |
@@ -4665,25 +4682,25 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
4665 | 4682 | ||
4666 | if (get_user(firmware_data, &firmware->firmware_data)) | 4683 | if (get_user(firmware_data, &firmware->firmware_data)) |
4667 | return -EFAULT; | 4684 | return -EFAULT; |
4668 | 4685 | ||
4669 | if (hdsp_check_for_iobox (hdsp)) | 4686 | if (hdsp_check_for_iobox (hdsp)) |
4670 | return -EIO; | 4687 | return -EIO; |
4671 | 4688 | ||
4672 | if (copy_from_user(hdsp->firmware_cache, firmware_data, sizeof(hdsp->firmware_cache)) != 0) | 4689 | if (copy_from_user(hdsp->firmware_cache, firmware_data, sizeof(hdsp->firmware_cache)) != 0) |
4673 | return -EFAULT; | 4690 | return -EFAULT; |
4674 | 4691 | ||
4675 | hdsp->state |= HDSP_FirmwareCached; | 4692 | hdsp->state |= HDSP_FirmwareCached; |
4676 | 4693 | ||
4677 | if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) | 4694 | if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) |
4678 | return err; | 4695 | return err; |
4679 | 4696 | ||
4680 | if (!(hdsp->state & HDSP_InitializationComplete)) { | 4697 | if (!(hdsp->state & HDSP_InitializationComplete)) { |
4681 | if ((err = snd_hdsp_enable_io(hdsp)) < 0) | 4698 | if ((err = snd_hdsp_enable_io(hdsp)) < 0) |
4682 | return err; | 4699 | return err; |
4683 | 4700 | ||
4684 | snd_hdsp_initialize_channels(hdsp); | 4701 | snd_hdsp_initialize_channels(hdsp); |
4685 | snd_hdsp_initialize_midi_flush(hdsp); | 4702 | snd_hdsp_initialize_midi_flush(hdsp); |
4686 | 4703 | ||
4687 | if ((err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp)) < 0) { | 4704 | if ((err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp)) < 0) { |
4688 | snd_printk(KERN_ERR "Hammerfall-DSP: error creating alsa devices\n"); | 4705 | snd_printk(KERN_ERR "Hammerfall-DSP: error creating alsa devices\n"); |
4689 | return err; | 4706 | return err; |
@@ -4730,18 +4747,16 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp) | |||
4730 | { | 4747 | { |
4731 | struct snd_hwdep *hw; | 4748 | struct snd_hwdep *hw; |
4732 | int err; | 4749 | int err; |
4733 | 4750 | ||
4734 | if ((err = snd_hwdep_new(card, "HDSP hwdep", 0, &hw)) < 0) | 4751 | if ((err = snd_hwdep_new(card, "HDSP hwdep", 0, &hw)) < 0) |
4735 | return err; | 4752 | return err; |
4736 | 4753 | ||
4737 | hdsp->hwdep = hw; | 4754 | hdsp->hwdep = hw; |
4738 | hw->private_data = hdsp; | 4755 | hw->private_data = hdsp; |
4739 | strcpy(hw->name, "HDSP hwdep interface"); | 4756 | strcpy(hw->name, "HDSP hwdep interface"); |
4740 | 4757 | ||
4741 | hw->ops.open = snd_hdsp_hwdep_dummy_op; | ||
4742 | hw->ops.ioctl = snd_hdsp_hwdep_ioctl; | 4758 | hw->ops.ioctl = snd_hdsp_hwdep_ioctl; |
4743 | hw->ops.release = snd_hdsp_hwdep_dummy_op; | 4759 | |
4744 | |||
4745 | return 0; | 4760 | return 0; |
4746 | } | 4761 | } |
4747 | 4762 | ||
@@ -4774,24 +4789,24 @@ static void snd_hdsp_9652_enable_mixer (struct hdsp *hdsp) | |||
4774 | static int snd_hdsp_enable_io (struct hdsp *hdsp) | 4789 | static int snd_hdsp_enable_io (struct hdsp *hdsp) |
4775 | { | 4790 | { |
4776 | int i; | 4791 | int i; |
4777 | 4792 | ||
4778 | if (hdsp_fifo_wait (hdsp, 0, 100)) { | 4793 | if (hdsp_fifo_wait (hdsp, 0, 100)) { |
4779 | snd_printk(KERN_ERR "Hammerfall-DSP: enable_io fifo_wait failed\n"); | 4794 | snd_printk(KERN_ERR "Hammerfall-DSP: enable_io fifo_wait failed\n"); |
4780 | return -EIO; | 4795 | return -EIO; |
4781 | } | 4796 | } |
4782 | 4797 | ||
4783 | for (i = 0; i < hdsp->max_channels; ++i) { | 4798 | for (i = 0; i < hdsp->max_channels; ++i) { |
4784 | hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1); | 4799 | hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1); |
4785 | hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1); | 4800 | hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1); |
4786 | } | 4801 | } |
4787 | 4802 | ||
4788 | return 0; | 4803 | return 0; |
4789 | } | 4804 | } |
4790 | 4805 | ||
4791 | static void snd_hdsp_initialize_channels(struct hdsp *hdsp) | 4806 | static void snd_hdsp_initialize_channels(struct hdsp *hdsp) |
4792 | { | 4807 | { |
4793 | int status, aebi_channels, aebo_channels; | 4808 | int status, aebi_channels, aebo_channels; |
4794 | 4809 | ||
4795 | switch (hdsp->io_type) { | 4810 | switch (hdsp->io_type) { |
4796 | case Digiface: | 4811 | case Digiface: |
4797 | hdsp->card_name = "RME Hammerfall DSP + Digiface"; | 4812 | hdsp->card_name = "RME Hammerfall DSP + Digiface"; |
@@ -4804,7 +4819,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp) | |||
4804 | hdsp->ss_in_channels = hdsp->ss_out_channels = H9652_SS_CHANNELS; | 4819 | hdsp->ss_in_channels = hdsp->ss_out_channels = H9652_SS_CHANNELS; |
4805 | hdsp->ds_in_channels = hdsp->ds_out_channels = H9652_DS_CHANNELS; | 4820 | hdsp->ds_in_channels = hdsp->ds_out_channels = H9652_DS_CHANNELS; |
4806 | break; | 4821 | break; |
4807 | 4822 | ||
4808 | case H9632: | 4823 | case H9632: |
4809 | status = hdsp_read(hdsp, HDSP_statusRegister); | 4824 | status = hdsp_read(hdsp, HDSP_statusRegister); |
4810 | /* HDSP_AEBx bits are low when AEB are connected */ | 4825 | /* HDSP_AEBx bits are low when AEB are connected */ |
@@ -4824,7 +4839,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp) | |||
4824 | hdsp->ss_in_channels = hdsp->ss_out_channels = MULTIFACE_SS_CHANNELS; | 4839 | hdsp->ss_in_channels = hdsp->ss_out_channels = MULTIFACE_SS_CHANNELS; |
4825 | hdsp->ds_in_channels = hdsp->ds_out_channels = MULTIFACE_DS_CHANNELS; | 4840 | hdsp->ds_in_channels = hdsp->ds_out_channels = MULTIFACE_DS_CHANNELS; |
4826 | break; | 4841 | break; |
4827 | 4842 | ||
4828 | default: | 4843 | default: |
4829 | /* should never get here */ | 4844 | /* should never get here */ |
4830 | break; | 4845 | break; |
@@ -4840,12 +4855,12 @@ static void snd_hdsp_initialize_midi_flush (struct hdsp *hdsp) | |||
4840 | static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp) | 4855 | static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp) |
4841 | { | 4856 | { |
4842 | int err; | 4857 | int err; |
4843 | 4858 | ||
4844 | if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) { | 4859 | if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) { |
4845 | snd_printk(KERN_ERR "Hammerfall-DSP: Error creating pcm interface\n"); | 4860 | snd_printk(KERN_ERR "Hammerfall-DSP: Error creating pcm interface\n"); |
4846 | return err; | 4861 | return err; |
4847 | } | 4862 | } |
4848 | 4863 | ||
4849 | 4864 | ||
4850 | if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) { | 4865 | if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) { |
4851 | snd_printk(KERN_ERR "Hammerfall-DSP: Error creating first midi interface\n"); | 4866 | snd_printk(KERN_ERR "Hammerfall-DSP: Error creating first midi interface\n"); |
@@ -4876,19 +4891,19 @@ static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp | |||
4876 | snd_printk(KERN_ERR "Hammerfall-DSP: Error setting default values\n"); | 4891 | snd_printk(KERN_ERR "Hammerfall-DSP: Error setting default values\n"); |
4877 | return err; | 4892 | return err; |
4878 | } | 4893 | } |
4879 | 4894 | ||
4880 | if (!(hdsp->state & HDSP_InitializationComplete)) { | 4895 | if (!(hdsp->state & HDSP_InitializationComplete)) { |
4881 | strcpy(card->shortname, "Hammerfall DSP"); | 4896 | strcpy(card->shortname, "Hammerfall DSP"); |
4882 | sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, | 4897 | sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, |
4883 | hdsp->port, hdsp->irq); | 4898 | hdsp->port, hdsp->irq); |
4884 | 4899 | ||
4885 | if ((err = snd_card_register(card)) < 0) { | 4900 | if ((err = snd_card_register(card)) < 0) { |
4886 | snd_printk(KERN_ERR "Hammerfall-DSP: error registering card\n"); | 4901 | snd_printk(KERN_ERR "Hammerfall-DSP: error registering card\n"); |
4887 | return err; | 4902 | return err; |
4888 | } | 4903 | } |
4889 | hdsp->state |= HDSP_InitializationComplete; | 4904 | hdsp->state |= HDSP_InitializationComplete; |
4890 | } | 4905 | } |
4891 | 4906 | ||
4892 | return 0; | 4907 | return 0; |
4893 | } | 4908 | } |
4894 | 4909 | ||
@@ -4899,7 +4914,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) | |||
4899 | const char *fwfile; | 4914 | const char *fwfile; |
4900 | const struct firmware *fw; | 4915 | const struct firmware *fw; |
4901 | int err; | 4916 | int err; |
4902 | 4917 | ||
4903 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) | 4918 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) |
4904 | return 0; | 4919 | return 0; |
4905 | if (hdsp->io_type == Undefined) { | 4920 | if (hdsp->io_type == Undefined) { |
@@ -4908,7 +4923,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) | |||
4908 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) | 4923 | if (hdsp->io_type == H9652 || hdsp->io_type == H9632) |
4909 | return 0; | 4924 | return 0; |
4910 | } | 4925 | } |
4911 | 4926 | ||
4912 | /* caution: max length of firmware filename is 30! */ | 4927 | /* caution: max length of firmware filename is 30! */ |
4913 | switch (hdsp->io_type) { | 4928 | switch (hdsp->io_type) { |
4914 | case Multiface: | 4929 | case Multiface: |
@@ -4942,12 +4957,12 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) | |||
4942 | memcpy(hdsp->firmware_cache, fw->data, sizeof(hdsp->firmware_cache)); | 4957 | memcpy(hdsp->firmware_cache, fw->data, sizeof(hdsp->firmware_cache)); |
4943 | 4958 | ||
4944 | release_firmware(fw); | 4959 | release_firmware(fw); |
4945 | 4960 | ||
4946 | hdsp->state |= HDSP_FirmwareCached; | 4961 | hdsp->state |= HDSP_FirmwareCached; |
4947 | 4962 | ||
4948 | if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) | 4963 | if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) |
4949 | return err; | 4964 | return err; |
4950 | 4965 | ||
4951 | if (!(hdsp->state & HDSP_InitializationComplete)) { | 4966 | if (!(hdsp->state & HDSP_InitializationComplete)) { |
4952 | if ((err = snd_hdsp_enable_io(hdsp)) < 0) | 4967 | if ((err = snd_hdsp_enable_io(hdsp)) < 0) |
4953 | return err; | 4968 | return err; |
@@ -4994,14 +5009,14 @@ static int __devinit snd_hdsp_create(struct snd_card *card, | |||
4994 | hdsp->max_channels = 26; | 5009 | hdsp->max_channels = 26; |
4995 | 5010 | ||
4996 | hdsp->card = card; | 5011 | hdsp->card = card; |
4997 | 5012 | ||
4998 | spin_lock_init(&hdsp->lock); | 5013 | spin_lock_init(&hdsp->lock); |
4999 | 5014 | ||
5000 | tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp); | 5015 | tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp); |
5001 | 5016 | ||
5002 | pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev); | 5017 | pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev); |
5003 | hdsp->firmware_rev &= 0xff; | 5018 | hdsp->firmware_rev &= 0xff; |
5004 | 5019 | ||
5005 | /* From Martin Bjoernsen : | 5020 | /* From Martin Bjoernsen : |
5006 | "It is important that the card's latency timer register in | 5021 | "It is important that the card's latency timer register in |
5007 | the PCI configuration space is set to a value much larger | 5022 | the PCI configuration space is set to a value much larger |
@@ -5010,7 +5025,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card, | |||
5010 | to its maximum 255 to avoid problems with some computers." | 5025 | to its maximum 255 to avoid problems with some computers." |
5011 | */ | 5026 | */ |
5012 | pci_write_config_byte(hdsp->pci, PCI_LATENCY_TIMER, 0xFF); | 5027 | pci_write_config_byte(hdsp->pci, PCI_LATENCY_TIMER, 0xFF); |
5013 | 5028 | ||
5014 | strcpy(card->driver, "H-DSP"); | 5029 | strcpy(card->driver, "H-DSP"); |
5015 | strcpy(card->mixername, "Xilinx FPGA"); | 5030 | strcpy(card->mixername, "Xilinx FPGA"); |
5016 | 5031 | ||
@@ -5024,7 +5039,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card, | |||
5024 | } else { | 5039 | } else { |
5025 | hdsp->card_name = "RME HDSP 9632"; | 5040 | hdsp->card_name = "RME HDSP 9632"; |
5026 | hdsp->max_channels = 16; | 5041 | hdsp->max_channels = 16; |
5027 | is_9632 = 1; | 5042 | is_9632 = 1; |
5028 | } | 5043 | } |
5029 | 5044 | ||
5030 | if ((err = pci_enable_device(pci)) < 0) | 5045 | if ((err = pci_enable_device(pci)) < 0) |
@@ -5053,12 +5068,12 @@ static int __devinit snd_hdsp_create(struct snd_card *card, | |||
5053 | 5068 | ||
5054 | if ((err = snd_hdsp_initialize_memory(hdsp)) < 0) | 5069 | if ((err = snd_hdsp_initialize_memory(hdsp)) < 0) |
5055 | return err; | 5070 | return err; |
5056 | 5071 | ||
5057 | if (!is_9652 && !is_9632) { | 5072 | if (!is_9652 && !is_9632) { |
5058 | /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */ | 5073 | /* we wait a maximum of 10 seconds to let freshly |
5059 | ssleep(2); | 5074 | * inserted cardbus cards do their hardware init */ |
5075 | err = hdsp_wait_for_iobox(hdsp, 1000, 10); | ||
5060 | 5076 | ||
5061 | err = hdsp_check_for_iobox(hdsp); | ||
5062 | if (err < 0) | 5077 | if (err < 0) |
5063 | return err; | 5078 | return err; |
5064 | 5079 | ||
@@ -5080,35 +5095,35 @@ static int __devinit snd_hdsp_create(struct snd_card *card, | |||
5080 | return err; | 5095 | return err; |
5081 | return 0; | 5096 | return 0; |
5082 | } else { | 5097 | } else { |
5083 | snd_printk(KERN_INFO "Hammerfall-DSP: Firmware already present, initializing card.\n"); | 5098 | snd_printk(KERN_INFO "Hammerfall-DSP: Firmware already present, initializing card.\n"); |
5084 | if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) | 5099 | if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) |
5085 | hdsp->io_type = Multiface; | 5100 | hdsp->io_type = Multiface; |
5086 | else | 5101 | else |
5087 | hdsp->io_type = Digiface; | 5102 | hdsp->io_type = Digiface; |
5088 | } | 5103 | } |
5089 | } | 5104 | } |
5090 | 5105 | ||
5091 | if ((err = snd_hdsp_enable_io(hdsp)) != 0) | 5106 | if ((err = snd_hdsp_enable_io(hdsp)) != 0) |
5092 | return err; | 5107 | return err; |
5093 | 5108 | ||
5094 | if (is_9652) | 5109 | if (is_9652) |
5095 | hdsp->io_type = H9652; | 5110 | hdsp->io_type = H9652; |
5096 | 5111 | ||
5097 | if (is_9632) | 5112 | if (is_9632) |
5098 | hdsp->io_type = H9632; | 5113 | hdsp->io_type = H9632; |
5099 | 5114 | ||
5100 | if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) | 5115 | if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) |
5101 | return err; | 5116 | return err; |
5102 | 5117 | ||
5103 | snd_hdsp_initialize_channels(hdsp); | 5118 | snd_hdsp_initialize_channels(hdsp); |
5104 | snd_hdsp_initialize_midi_flush(hdsp); | 5119 | snd_hdsp_initialize_midi_flush(hdsp); |
5105 | 5120 | ||
5106 | hdsp->state |= HDSP_FirmwareLoaded; | 5121 | hdsp->state |= HDSP_FirmwareLoaded; |
5107 | 5122 | ||
5108 | if ((err = snd_hdsp_create_alsa_devices(card, hdsp)) < 0) | 5123 | if ((err = snd_hdsp_create_alsa_devices(card, hdsp)) < 0) |
5109 | return err; | 5124 | return err; |
5110 | 5125 | ||
5111 | return 0; | 5126 | return 0; |
5112 | } | 5127 | } |
5113 | 5128 | ||
5114 | static int snd_hdsp_free(struct hdsp *hdsp) | 5129 | static int snd_hdsp_free(struct hdsp *hdsp) |
@@ -5124,13 +5139,13 @@ static int snd_hdsp_free(struct hdsp *hdsp) | |||
5124 | free_irq(hdsp->irq, (void *)hdsp); | 5139 | free_irq(hdsp->irq, (void *)hdsp); |
5125 | 5140 | ||
5126 | snd_hdsp_free_buffers(hdsp); | 5141 | snd_hdsp_free_buffers(hdsp); |
5127 | 5142 | ||
5128 | if (hdsp->iobase) | 5143 | if (hdsp->iobase) |
5129 | iounmap(hdsp->iobase); | 5144 | iounmap(hdsp->iobase); |
5130 | 5145 | ||
5131 | if (hdsp->port) | 5146 | if (hdsp->port) |
5132 | pci_release_regions(hdsp->pci); | 5147 | pci_release_regions(hdsp->pci); |
5133 | 5148 | ||
5134 | pci_disable_device(hdsp->pci); | 5149 | pci_disable_device(hdsp->pci); |
5135 | return 0; | 5150 | return 0; |
5136 | } | 5151 | } |
@@ -5175,7 +5190,7 @@ static int __devinit snd_hdsp_probe(struct pci_dev *pci, | |||
5175 | } | 5190 | } |
5176 | 5191 | ||
5177 | strcpy(card->shortname, "Hammerfall DSP"); | 5192 | strcpy(card->shortname, "Hammerfall DSP"); |
5178 | sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, | 5193 | sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, |
5179 | hdsp->port, hdsp->irq); | 5194 | hdsp->port, hdsp->irq); |
5180 | 5195 | ||
5181 | if ((err = snd_card_register(card)) < 0) { | 5196 | if ((err = snd_card_register(card)) < 0) { |
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index d4b4e0d0fee8..bac2dc0c5d85 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
@@ -4100,13 +4100,6 @@ static int snd_hdspm_capture_release(struct snd_pcm_substream *substream) | |||
4100 | return 0; | 4100 | return 0; |
4101 | } | 4101 | } |
4102 | 4102 | ||
4103 | static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep * hw, struct file *file) | ||
4104 | { | ||
4105 | /* we have nothing to initialize but the call is required */ | ||
4106 | return 0; | ||
4107 | } | ||
4108 | |||
4109 | |||
4110 | static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, | 4103 | static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, |
4111 | unsigned int cmd, unsigned long arg) | 4104 | unsigned int cmd, unsigned long arg) |
4112 | { | 4105 | { |
@@ -4213,9 +4206,7 @@ static int __devinit snd_hdspm_create_hwdep(struct snd_card *card, | |||
4213 | hw->private_data = hdspm; | 4206 | hw->private_data = hdspm; |
4214 | strcpy(hw->name, "HDSPM hwdep interface"); | 4207 | strcpy(hw->name, "HDSPM hwdep interface"); |
4215 | 4208 | ||
4216 | hw->ops.open = snd_hdspm_hwdep_dummy_op; | ||
4217 | hw->ops.ioctl = snd_hdspm_hwdep_ioctl; | 4209 | hw->ops.ioctl = snd_hdspm_hwdep_ioctl; |
4218 | hw->ops.release = snd_hdspm_hwdep_dummy_op; | ||
4219 | 4210 | ||
4220 | return 0; | 4211 | return 0; |
4221 | } | 4212 | } |
diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index baf6d8e3dabc..1a5ff0611072 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c | |||
@@ -1300,7 +1300,7 @@ static int __devinit sis_chip_create(struct snd_card *card, | |||
1300 | if (rc) | 1300 | if (rc) |
1301 | goto error_out; | 1301 | goto error_out; |
1302 | 1302 | ||
1303 | if (pci_set_dma_mask(pci, DMA_30BIT_MASK) < 0) { | 1303 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0) { |
1304 | printk(KERN_ERR "sis7019: architecture does not support " | 1304 | printk(KERN_ERR "sis7019: architecture does not support " |
1305 | "30-bit PCI busmaster DMA"); | 1305 | "30-bit PCI busmaster DMA"); |
1306 | goto error_out_enabled; | 1306 | goto error_out_enabled; |
diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index c5601b0ad7cc..7dc60ad4772e 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c | |||
@@ -273,7 +273,8 @@ static inline void snd_sonicvibes_setdmaa(struct sonicvibes * sonic, | |||
273 | outl(count, sonic->dmaa_port + SV_DMA_COUNT0); | 273 | outl(count, sonic->dmaa_port + SV_DMA_COUNT0); |
274 | outb(0x18, sonic->dmaa_port + SV_DMA_MODE); | 274 | outb(0x18, sonic->dmaa_port + SV_DMA_MODE); |
275 | #if 0 | 275 | #if 0 |
276 | printk("program dmaa: addr = 0x%x, paddr = 0x%x\n", addr, inl(sonic->dmaa_port + SV_DMA_ADDR0)); | 276 | printk(KERN_DEBUG "program dmaa: addr = 0x%x, paddr = 0x%x\n", |
277 | addr, inl(sonic->dmaa_port + SV_DMA_ADDR0)); | ||
277 | #endif | 278 | #endif |
278 | } | 279 | } |
279 | 280 | ||
@@ -288,7 +289,8 @@ static inline void snd_sonicvibes_setdmac(struct sonicvibes * sonic, | |||
288 | outl(count, sonic->dmac_port + SV_DMA_COUNT0); | 289 | outl(count, sonic->dmac_port + SV_DMA_COUNT0); |
289 | outb(0x14, sonic->dmac_port + SV_DMA_MODE); | 290 | outb(0x14, sonic->dmac_port + SV_DMA_MODE); |
290 | #if 0 | 291 | #if 0 |
291 | printk("program dmac: addr = 0x%x, paddr = 0x%x\n", addr, inl(sonic->dmac_port + SV_DMA_ADDR0)); | 292 | printk(KERN_DEBUG "program dmac: addr = 0x%x, paddr = 0x%x\n", |
293 | addr, inl(sonic->dmac_port + SV_DMA_ADDR0)); | ||
292 | #endif | 294 | #endif |
293 | } | 295 | } |
294 | 296 | ||
@@ -355,71 +357,104 @@ static unsigned char snd_sonicvibes_in(struct sonicvibes * sonic, unsigned char | |||
355 | #if 0 | 357 | #if 0 |
356 | static void snd_sonicvibes_debug(struct sonicvibes * sonic) | 358 | static void snd_sonicvibes_debug(struct sonicvibes * sonic) |
357 | { | 359 | { |
358 | printk("SV REGS: INDEX = 0x%02x ", inb(SV_REG(sonic, INDEX))); | 360 | printk(KERN_DEBUG |
361 | "SV REGS: INDEX = 0x%02x ", inb(SV_REG(sonic, INDEX))); | ||
359 | printk(" STATUS = 0x%02x\n", inb(SV_REG(sonic, STATUS))); | 362 | printk(" STATUS = 0x%02x\n", inb(SV_REG(sonic, STATUS))); |
360 | printk(" 0x00: left input = 0x%02x ", snd_sonicvibes_in(sonic, 0x00)); | 363 | printk(KERN_DEBUG |
364 | " 0x00: left input = 0x%02x ", snd_sonicvibes_in(sonic, 0x00)); | ||
361 | printk(" 0x20: synth rate low = 0x%02x\n", snd_sonicvibes_in(sonic, 0x20)); | 365 | printk(" 0x20: synth rate low = 0x%02x\n", snd_sonicvibes_in(sonic, 0x20)); |
362 | printk(" 0x01: right input = 0x%02x ", snd_sonicvibes_in(sonic, 0x01)); | 366 | printk(KERN_DEBUG |
367 | " 0x01: right input = 0x%02x ", snd_sonicvibes_in(sonic, 0x01)); | ||
363 | printk(" 0x21: synth rate high = 0x%02x\n", snd_sonicvibes_in(sonic, 0x21)); | 368 | printk(" 0x21: synth rate high = 0x%02x\n", snd_sonicvibes_in(sonic, 0x21)); |
364 | printk(" 0x02: left AUX1 = 0x%02x ", snd_sonicvibes_in(sonic, 0x02)); | 369 | printk(KERN_DEBUG |
370 | " 0x02: left AUX1 = 0x%02x ", snd_sonicvibes_in(sonic, 0x02)); | ||
365 | printk(" 0x22: ADC clock = 0x%02x\n", snd_sonicvibes_in(sonic, 0x22)); | 371 | printk(" 0x22: ADC clock = 0x%02x\n", snd_sonicvibes_in(sonic, 0x22)); |
366 | printk(" 0x03: right AUX1 = 0x%02x ", snd_sonicvibes_in(sonic, 0x03)); | 372 | printk(KERN_DEBUG |
373 | " 0x03: right AUX1 = 0x%02x ", snd_sonicvibes_in(sonic, 0x03)); | ||
367 | printk(" 0x23: ADC alt rate = 0x%02x\n", snd_sonicvibes_in(sonic, 0x23)); | 374 | printk(" 0x23: ADC alt rate = 0x%02x\n", snd_sonicvibes_in(sonic, 0x23)); |
368 | printk(" 0x04: left CD = 0x%02x ", snd_sonicvibes_in(sonic, 0x04)); | 375 | printk(KERN_DEBUG |
376 | " 0x04: left CD = 0x%02x ", snd_sonicvibes_in(sonic, 0x04)); | ||
369 | printk(" 0x24: ADC pll M = 0x%02x\n", snd_sonicvibes_in(sonic, 0x24)); | 377 | printk(" 0x24: ADC pll M = 0x%02x\n", snd_sonicvibes_in(sonic, 0x24)); |
370 | printk(" 0x05: right CD = 0x%02x ", snd_sonicvibes_in(sonic, 0x05)); | 378 | printk(KERN_DEBUG |
379 | " 0x05: right CD = 0x%02x ", snd_sonicvibes_in(sonic, 0x05)); | ||
371 | printk(" 0x25: ADC pll N = 0x%02x\n", snd_sonicvibes_in(sonic, 0x25)); | 380 | printk(" 0x25: ADC pll N = 0x%02x\n", snd_sonicvibes_in(sonic, 0x25)); |
372 | printk(" 0x06: left line = 0x%02x ", snd_sonicvibes_in(sonic, 0x06)); | 381 | printk(KERN_DEBUG |
382 | " 0x06: left line = 0x%02x ", snd_sonicvibes_in(sonic, 0x06)); | ||
373 | printk(" 0x26: Synth pll M = 0x%02x\n", snd_sonicvibes_in(sonic, 0x26)); | 383 | printk(" 0x26: Synth pll M = 0x%02x\n", snd_sonicvibes_in(sonic, 0x26)); |
374 | printk(" 0x07: right line = 0x%02x ", snd_sonicvibes_in(sonic, 0x07)); | 384 | printk(KERN_DEBUG |
385 | " 0x07: right line = 0x%02x ", snd_sonicvibes_in(sonic, 0x07)); | ||
375 | printk(" 0x27: Synth pll N = 0x%02x\n", snd_sonicvibes_in(sonic, 0x27)); | 386 | printk(" 0x27: Synth pll N = 0x%02x\n", snd_sonicvibes_in(sonic, 0x27)); |
376 | printk(" 0x08: MIC = 0x%02x ", snd_sonicvibes_in(sonic, 0x08)); | 387 | printk(KERN_DEBUG |
388 | " 0x08: MIC = 0x%02x ", snd_sonicvibes_in(sonic, 0x08)); | ||
377 | printk(" 0x28: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x28)); | 389 | printk(" 0x28: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x28)); |
378 | printk(" 0x09: Game port = 0x%02x ", snd_sonicvibes_in(sonic, 0x09)); | 390 | printk(KERN_DEBUG |
391 | " 0x09: Game port = 0x%02x ", snd_sonicvibes_in(sonic, 0x09)); | ||
379 | printk(" 0x29: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x29)); | 392 | printk(" 0x29: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x29)); |
380 | printk(" 0x0a: left synth = 0x%02x ", snd_sonicvibes_in(sonic, 0x0a)); | 393 | printk(KERN_DEBUG |
394 | " 0x0a: left synth = 0x%02x ", snd_sonicvibes_in(sonic, 0x0a)); | ||
381 | printk(" 0x2a: MPU401 = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2a)); | 395 | printk(" 0x2a: MPU401 = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2a)); |
382 | printk(" 0x0b: right synth = 0x%02x ", snd_sonicvibes_in(sonic, 0x0b)); | 396 | printk(KERN_DEBUG |
397 | " 0x0b: right synth = 0x%02x ", snd_sonicvibes_in(sonic, 0x0b)); | ||
383 | printk(" 0x2b: drive ctrl = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2b)); | 398 | printk(" 0x2b: drive ctrl = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2b)); |
384 | printk(" 0x0c: left AUX2 = 0x%02x ", snd_sonicvibes_in(sonic, 0x0c)); | 399 | printk(KERN_DEBUG |
400 | " 0x0c: left AUX2 = 0x%02x ", snd_sonicvibes_in(sonic, 0x0c)); | ||
385 | printk(" 0x2c: SRS space = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2c)); | 401 | printk(" 0x2c: SRS space = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2c)); |
386 | printk(" 0x0d: right AUX2 = 0x%02x ", snd_sonicvibes_in(sonic, 0x0d)); | 402 | printk(KERN_DEBUG |
403 | " 0x0d: right AUX2 = 0x%02x ", snd_sonicvibes_in(sonic, 0x0d)); | ||
387 | printk(" 0x2d: SRS center = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2d)); | 404 | printk(" 0x2d: SRS center = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2d)); |
388 | printk(" 0x0e: left analog = 0x%02x ", snd_sonicvibes_in(sonic, 0x0e)); | 405 | printk(KERN_DEBUG |
406 | " 0x0e: left analog = 0x%02x ", snd_sonicvibes_in(sonic, 0x0e)); | ||
389 | printk(" 0x2e: wave source = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2e)); | 407 | printk(" 0x2e: wave source = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2e)); |
390 | printk(" 0x0f: right analog = 0x%02x ", snd_sonicvibes_in(sonic, 0x0f)); | 408 | printk(KERN_DEBUG |
409 | " 0x0f: right analog = 0x%02x ", snd_sonicvibes_in(sonic, 0x0f)); | ||
391 | printk(" 0x2f: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2f)); | 410 | printk(" 0x2f: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x2f)); |
392 | printk(" 0x10: left PCM = 0x%02x ", snd_sonicvibes_in(sonic, 0x10)); | 411 | printk(KERN_DEBUG |
412 | " 0x10: left PCM = 0x%02x ", snd_sonicvibes_in(sonic, 0x10)); | ||
393 | printk(" 0x30: analog power = 0x%02x\n", snd_sonicvibes_in(sonic, 0x30)); | 413 | printk(" 0x30: analog power = 0x%02x\n", snd_sonicvibes_in(sonic, 0x30)); |
394 | printk(" 0x11: right PCM = 0x%02x ", snd_sonicvibes_in(sonic, 0x11)); | 414 | printk(KERN_DEBUG |
415 | " 0x11: right PCM = 0x%02x ", snd_sonicvibes_in(sonic, 0x11)); | ||
395 | printk(" 0x31: analog power = 0x%02x\n", snd_sonicvibes_in(sonic, 0x31)); | 416 | printk(" 0x31: analog power = 0x%02x\n", snd_sonicvibes_in(sonic, 0x31)); |
396 | printk(" 0x12: DMA data format = 0x%02x ", snd_sonicvibes_in(sonic, 0x12)); | 417 | printk(KERN_DEBUG |
418 | " 0x12: DMA data format = 0x%02x ", snd_sonicvibes_in(sonic, 0x12)); | ||
397 | printk(" 0x32: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x32)); | 419 | printk(" 0x32: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x32)); |
398 | printk(" 0x13: P/C enable = 0x%02x ", snd_sonicvibes_in(sonic, 0x13)); | 420 | printk(KERN_DEBUG |
421 | " 0x13: P/C enable = 0x%02x ", snd_sonicvibes_in(sonic, 0x13)); | ||
399 | printk(" 0x33: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x33)); | 422 | printk(" 0x33: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x33)); |
400 | printk(" 0x14: U/D button = 0x%02x ", snd_sonicvibes_in(sonic, 0x14)); | 423 | printk(KERN_DEBUG |
424 | " 0x14: U/D button = 0x%02x ", snd_sonicvibes_in(sonic, 0x14)); | ||
401 | printk(" 0x34: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x34)); | 425 | printk(" 0x34: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x34)); |
402 | printk(" 0x15: revision = 0x%02x ", snd_sonicvibes_in(sonic, 0x15)); | 426 | printk(KERN_DEBUG |
427 | " 0x15: revision = 0x%02x ", snd_sonicvibes_in(sonic, 0x15)); | ||
403 | printk(" 0x35: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x35)); | 428 | printk(" 0x35: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x35)); |
404 | printk(" 0x16: ADC output ctrl = 0x%02x ", snd_sonicvibes_in(sonic, 0x16)); | 429 | printk(KERN_DEBUG |
430 | " 0x16: ADC output ctrl = 0x%02x ", snd_sonicvibes_in(sonic, 0x16)); | ||
405 | printk(" 0x36: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x36)); | 431 | printk(" 0x36: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x36)); |
406 | printk(" 0x17: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x17)); | 432 | printk(KERN_DEBUG |
433 | " 0x17: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x17)); | ||
407 | printk(" 0x37: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x37)); | 434 | printk(" 0x37: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x37)); |
408 | printk(" 0x18: DMA A upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x18)); | 435 | printk(KERN_DEBUG |
436 | " 0x18: DMA A upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x18)); | ||
409 | printk(" 0x38: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x38)); | 437 | printk(" 0x38: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x38)); |
410 | printk(" 0x19: DMA A lower cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x19)); | 438 | printk(KERN_DEBUG |
439 | " 0x19: DMA A lower cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x19)); | ||
411 | printk(" 0x39: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x39)); | 440 | printk(" 0x39: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x39)); |
412 | printk(" 0x1a: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x1a)); | 441 | printk(KERN_DEBUG |
442 | " 0x1a: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x1a)); | ||
413 | printk(" 0x3a: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3a)); | 443 | printk(" 0x3a: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3a)); |
414 | printk(" 0x1b: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x1b)); | 444 | printk(KERN_DEBUG |
445 | " 0x1b: --- = 0x%02x ", snd_sonicvibes_in(sonic, 0x1b)); | ||
415 | printk(" 0x3b: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3b)); | 446 | printk(" 0x3b: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3b)); |
416 | printk(" 0x1c: DMA C upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x1c)); | 447 | printk(KERN_DEBUG |
448 | " 0x1c: DMA C upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x1c)); | ||
417 | printk(" 0x3c: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3c)); | 449 | printk(" 0x3c: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3c)); |
418 | printk(" 0x1d: DMA C upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x1d)); | 450 | printk(KERN_DEBUG |
451 | " 0x1d: DMA C upper cnt = 0x%02x ", snd_sonicvibes_in(sonic, 0x1d)); | ||
419 | printk(" 0x3d: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3d)); | 452 | printk(" 0x3d: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3d)); |
420 | printk(" 0x1e: PCM rate low = 0x%02x ", snd_sonicvibes_in(sonic, 0x1e)); | 453 | printk(KERN_DEBUG |
454 | " 0x1e: PCM rate low = 0x%02x ", snd_sonicvibes_in(sonic, 0x1e)); | ||
421 | printk(" 0x3e: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3e)); | 455 | printk(" 0x3e: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3e)); |
422 | printk(" 0x1f: PCM rate high = 0x%02x ", snd_sonicvibes_in(sonic, 0x1f)); | 456 | printk(KERN_DEBUG |
457 | " 0x1f: PCM rate high = 0x%02x ", snd_sonicvibes_in(sonic, 0x1f)); | ||
423 | printk(" 0x3f: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3f)); | 458 | printk(" 0x3f: --- = 0x%02x\n", snd_sonicvibes_in(sonic, 0x3f)); |
424 | } | 459 | } |
425 | 460 | ||
@@ -476,8 +511,8 @@ static void snd_sonicvibes_pll(unsigned int rate, | |||
476 | *res_m = m; | 511 | *res_m = m; |
477 | *res_n = n; | 512 | *res_n = n; |
478 | #if 0 | 513 | #if 0 |
479 | printk("metric = %i, xm = %i, xn = %i\n", metric, xm, xn); | 514 | printk(KERN_DEBUG "metric = %i, xm = %i, xn = %i\n", metric, xm, xn); |
480 | printk("pll: m = 0x%x, r = 0x%x, n = 0x%x\n", reg, m, r, n); | 515 | printk(KERN_DEBUG "pll: m = 0x%x, r = 0x%x, n = 0x%x\n", reg, m, r, n); |
481 | #endif | 516 | #endif |
482 | } | 517 | } |
483 | 518 | ||
@@ -1229,8 +1264,8 @@ static int __devinit snd_sonicvibes_create(struct snd_card *card, | |||
1229 | if ((err = pci_enable_device(pci)) < 0) | 1264 | if ((err = pci_enable_device(pci)) < 0) |
1230 | return err; | 1265 | return err; |
1231 | /* check, if we can restrict PCI DMA transfers to 24 bits */ | 1266 | /* check, if we can restrict PCI DMA transfers to 24 bits */ |
1232 | if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || | 1267 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 || |
1233 | pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { | 1268 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) { |
1234 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); | 1269 | snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); |
1235 | pci_disable_device(pci); | 1270 | pci_disable_device(pci); |
1236 | return -ENXIO; | 1271 | return -ENXIO; |
diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index c612b435ca2b..6d943f6f6b70 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c | |||
@@ -68,40 +68,40 @@ static void snd_trident_print_voice_regs(struct snd_trident *trident, int voice) | |||
68 | { | 68 | { |
69 | unsigned int val, tmp; | 69 | unsigned int val, tmp; |
70 | 70 | ||
71 | printk("Trident voice %i:\n", voice); | 71 | printk(KERN_DEBUG "Trident voice %i:\n", voice); |
72 | outb(voice, TRID_REG(trident, T4D_LFO_GC_CIR)); | 72 | outb(voice, TRID_REG(trident, T4D_LFO_GC_CIR)); |
73 | val = inl(TRID_REG(trident, CH_LBA)); | 73 | val = inl(TRID_REG(trident, CH_LBA)); |
74 | printk("LBA: 0x%x\n", val); | 74 | printk(KERN_DEBUG "LBA: 0x%x\n", val); |
75 | val = inl(TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC)); | 75 | val = inl(TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC)); |
76 | printk("GVSel: %i\n", val >> 31); | 76 | printk(KERN_DEBUG "GVSel: %i\n", val >> 31); |
77 | printk("Pan: 0x%x\n", (val >> 24) & 0x7f); | 77 | printk(KERN_DEBUG "Pan: 0x%x\n", (val >> 24) & 0x7f); |
78 | printk("Vol: 0x%x\n", (val >> 16) & 0xff); | 78 | printk(KERN_DEBUG "Vol: 0x%x\n", (val >> 16) & 0xff); |
79 | printk("CTRL: 0x%x\n", (val >> 12) & 0x0f); | 79 | printk(KERN_DEBUG "CTRL: 0x%x\n", (val >> 12) & 0x0f); |
80 | printk("EC: 0x%x\n", val & 0x0fff); | 80 | printk(KERN_DEBUG "EC: 0x%x\n", val & 0x0fff); |
81 | if (trident->device != TRIDENT_DEVICE_ID_NX) { | 81 | if (trident->device != TRIDENT_DEVICE_ID_NX) { |
82 | val = inl(TRID_REG(trident, CH_DX_CSO_ALPHA_FMS)); | 82 | val = inl(TRID_REG(trident, CH_DX_CSO_ALPHA_FMS)); |
83 | printk("CSO: 0x%x\n", val >> 16); | 83 | printk(KERN_DEBUG "CSO: 0x%x\n", val >> 16); |
84 | printk("Alpha: 0x%x\n", (val >> 4) & 0x0fff); | 84 | printk("Alpha: 0x%x\n", (val >> 4) & 0x0fff); |
85 | printk("FMS: 0x%x\n", val & 0x0f); | 85 | printk(KERN_DEBUG "FMS: 0x%x\n", val & 0x0f); |
86 | val = inl(TRID_REG(trident, CH_DX_ESO_DELTA)); | 86 | val = inl(TRID_REG(trident, CH_DX_ESO_DELTA)); |
87 | printk("ESO: 0x%x\n", val >> 16); | 87 | printk(KERN_DEBUG "ESO: 0x%x\n", val >> 16); |
88 | printk("Delta: 0x%x\n", val & 0xffff); | 88 | printk(KERN_DEBUG "Delta: 0x%x\n", val & 0xffff); |
89 | val = inl(TRID_REG(trident, CH_DX_FMC_RVOL_CVOL)); | 89 | val = inl(TRID_REG(trident, CH_DX_FMC_RVOL_CVOL)); |
90 | } else { // TRIDENT_DEVICE_ID_NX | 90 | } else { // TRIDENT_DEVICE_ID_NX |
91 | val = inl(TRID_REG(trident, CH_NX_DELTA_CSO)); | 91 | val = inl(TRID_REG(trident, CH_NX_DELTA_CSO)); |
92 | tmp = (val >> 24) & 0xff; | 92 | tmp = (val >> 24) & 0xff; |
93 | printk("CSO: 0x%x\n", val & 0x00ffffff); | 93 | printk(KERN_DEBUG "CSO: 0x%x\n", val & 0x00ffffff); |
94 | val = inl(TRID_REG(trident, CH_NX_DELTA_ESO)); | 94 | val = inl(TRID_REG(trident, CH_NX_DELTA_ESO)); |
95 | tmp |= (val >> 16) & 0xff00; | 95 | tmp |= (val >> 16) & 0xff00; |
96 | printk("Delta: 0x%x\n", tmp); | 96 | printk(KERN_DEBUG "Delta: 0x%x\n", tmp); |
97 | printk("ESO: 0x%x\n", val & 0x00ffffff); | 97 | printk(KERN_DEBUG "ESO: 0x%x\n", val & 0x00ffffff); |
98 | val = inl(TRID_REG(trident, CH_NX_ALPHA_FMS_FMC_RVOL_CVOL)); | 98 | val = inl(TRID_REG(trident, CH_NX_ALPHA_FMS_FMC_RVOL_CVOL)); |
99 | printk("Alpha: 0x%x\n", val >> 20); | 99 | printk(KERN_DEBUG "Alpha: 0x%x\n", val >> 20); |
100 | printk("FMS: 0x%x\n", (val >> 16) & 0x0f); | 100 | printk(KERN_DEBUG "FMS: 0x%x\n", (val >> 16) & 0x0f); |
101 | } | 101 | } |
102 | printk("FMC: 0x%x\n", (val >> 14) & 3); | 102 | printk(KERN_DEBUG "FMC: 0x%x\n", (val >> 14) & 3); |
103 | printk("RVol: 0x%x\n", (val >> 7) & 0x7f); | 103 | printk(KERN_DEBUG "RVol: 0x%x\n", (val >> 7) & 0x7f); |
104 | printk("CVol: 0x%x\n", val & 0x7f); | 104 | printk(KERN_DEBUG "CVol: 0x%x\n", val & 0x7f); |
105 | } | 105 | } |
106 | #endif | 106 | #endif |
107 | 107 | ||
@@ -496,12 +496,17 @@ void snd_trident_write_voice_regs(struct snd_trident * trident, | |||
496 | outl(regs[4], TRID_REG(trident, CH_START + 16)); | 496 | outl(regs[4], TRID_REG(trident, CH_START + 16)); |
497 | 497 | ||
498 | #if 0 | 498 | #if 0 |
499 | printk("written %i channel:\n", voice->number); | 499 | printk(KERN_DEBUG "written %i channel:\n", voice->number); |
500 | printk(" regs[0] = 0x%x/0x%x\n", regs[0], inl(TRID_REG(trident, CH_START + 0))); | 500 | printk(KERN_DEBUG " regs[0] = 0x%x/0x%x\n", |
501 | printk(" regs[1] = 0x%x/0x%x\n", regs[1], inl(TRID_REG(trident, CH_START + 4))); | 501 | regs[0], inl(TRID_REG(trident, CH_START + 0))); |
502 | printk(" regs[2] = 0x%x/0x%x\n", regs[2], inl(TRID_REG(trident, CH_START + 8))); | 502 | printk(KERN_DEBUG " regs[1] = 0x%x/0x%x\n", |
503 | printk(" regs[3] = 0x%x/0x%x\n", regs[3], inl(TRID_REG(trident, CH_START + 12))); | 503 | regs[1], inl(TRID_REG(trident, CH_START + 4))); |
504 | printk(" regs[4] = 0x%x/0x%x\n", regs[4], inl(TRID_REG(trident, CH_START + 16))); | 504 | printk(KERN_DEBUG " regs[2] = 0x%x/0x%x\n", |
505 | regs[2], inl(TRID_REG(trident, CH_START + 8))); | ||
506 | printk(KERN_DEBUG " regs[3] = 0x%x/0x%x\n", | ||
507 | regs[3], inl(TRID_REG(trident, CH_START + 12))); | ||
508 | printk(KERN_DEBUG " regs[4] = 0x%x/0x%x\n", | ||
509 | regs[4], inl(TRID_REG(trident, CH_START + 16))); | ||
505 | #endif | 510 | #endif |
506 | } | 511 | } |
507 | 512 | ||
@@ -583,7 +588,7 @@ static void snd_trident_write_vol_reg(struct snd_trident * trident, | |||
583 | outb(voice->Vol >> 2, TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC + 2)); | 588 | outb(voice->Vol >> 2, TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC + 2)); |
584 | break; | 589 | break; |
585 | case TRIDENT_DEVICE_ID_SI7018: | 590 | case TRIDENT_DEVICE_ID_SI7018: |
586 | // printk("voice->Vol = 0x%x\n", voice->Vol); | 591 | /* printk(KERN_DEBUG "voice->Vol = 0x%x\n", voice->Vol); */ |
587 | outw((voice->CTRL << 12) | voice->Vol, | 592 | outw((voice->CTRL << 12) | voice->Vol, |
588 | TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC)); | 593 | TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC)); |
589 | break; | 594 | break; |
@@ -3554,8 +3559,8 @@ int __devinit snd_trident_create(struct snd_card *card, | |||
3554 | if ((err = pci_enable_device(pci)) < 0) | 3559 | if ((err = pci_enable_device(pci)) < 0) |
3555 | return err; | 3560 | return err; |
3556 | /* check, if we can restrict PCI DMA transfers to 30 bits */ | 3561 | /* check, if we can restrict PCI DMA transfers to 30 bits */ |
3557 | if (pci_set_dma_mask(pci, DMA_30BIT_MASK) < 0 || | 3562 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0 || |
3558 | pci_set_consistent_dma_mask(pci, DMA_30BIT_MASK) < 0) { | 3563 | pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(30)) < 0) { |
3559 | snd_printk(KERN_ERR "architecture does not support 30bit PCI busmaster DMA\n"); | 3564 | snd_printk(KERN_ERR "architecture does not support 30bit PCI busmaster DMA\n"); |
3560 | pci_disable_device(pci); | 3565 | pci_disable_device(pci); |
3561 | return -ENXIO; | 3566 | return -ENXIO; |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index d8705547dae1..809b233dd4a3 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
@@ -466,7 +466,10 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre | |||
466 | flag = VIA_TBL_BIT_FLAG; /* period boundary */ | 466 | flag = VIA_TBL_BIT_FLAG; /* period boundary */ |
467 | } else | 467 | } else |
468 | flag = 0; /* period continues to the next */ | 468 | flag = 0; /* period continues to the next */ |
469 | // printk("via: tbl %d: at %d size %d (rest %d)\n", idx, ofs, r, rest); | 469 | /* |
470 | printk(KERN_DEBUG "via: tbl %d: at %d size %d " | ||
471 | "(rest %d)\n", idx, ofs, r, rest); | ||
472 | */ | ||
470 | ((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag); | 473 | ((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag); |
471 | dev->idx_table[idx].offset = ofs; | 474 | dev->idx_table[idx].offset = ofs; |
472 | dev->idx_table[idx].size = r; | 475 | dev->idx_table[idx].size = r; |
@@ -2360,14 +2363,14 @@ static struct snd_pci_quirk dxs_whitelist[] __devinitdata = { | |||
2360 | SND_PCI_QUIRK(0x1019, 0x0996, "ESC Mobo", VIA_DXS_48K), | 2363 | SND_PCI_QUIRK(0x1019, 0x0996, "ESC Mobo", VIA_DXS_48K), |
2361 | SND_PCI_QUIRK(0x1019, 0x0a81, "ECS K7VTA3 v8.0", VIA_DXS_NO_VRA), | 2364 | SND_PCI_QUIRK(0x1019, 0x0a81, "ECS K7VTA3 v8.0", VIA_DXS_NO_VRA), |
2362 | SND_PCI_QUIRK(0x1019, 0x0a85, "ECS L7VMM2", VIA_DXS_NO_VRA), | 2365 | SND_PCI_QUIRK(0x1019, 0x0a85, "ECS L7VMM2", VIA_DXS_NO_VRA), |
2363 | SND_PCI_QUIRK(0x1019, 0, "ESC K8", VIA_DXS_SRC), | 2366 | SND_PCI_QUIRK_VENDOR(0x1019, "ESC K8", VIA_DXS_SRC), |
2364 | SND_PCI_QUIRK(0x1019, 0xaa01, "ESC K8T890-A", VIA_DXS_SRC), | 2367 | SND_PCI_QUIRK(0x1019, 0xaa01, "ESC K8T890-A", VIA_DXS_SRC), |
2365 | SND_PCI_QUIRK(0x1025, 0x0033, "Acer Inspire 1353LM", VIA_DXS_NO_VRA), | 2368 | SND_PCI_QUIRK(0x1025, 0x0033, "Acer Inspire 1353LM", VIA_DXS_NO_VRA), |
2366 | SND_PCI_QUIRK(0x1025, 0x0046, "Acer Aspire 1524 WLMi", VIA_DXS_SRC), | 2369 | SND_PCI_QUIRK(0x1025, 0x0046, "Acer Aspire 1524 WLMi", VIA_DXS_SRC), |
2367 | SND_PCI_QUIRK(0x1043, 0, "ASUS A7/A8", VIA_DXS_NO_VRA), | 2370 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS A7/A8", VIA_DXS_NO_VRA), |
2368 | SND_PCI_QUIRK(0x1071, 0, "Diverse Notebook", VIA_DXS_NO_VRA), | 2371 | SND_PCI_QUIRK_VENDOR(0x1071, "Diverse Notebook", VIA_DXS_NO_VRA), |
2369 | SND_PCI_QUIRK(0x10cf, 0x118e, "FSC Laptop", VIA_DXS_ENABLE), | 2372 | SND_PCI_QUIRK(0x10cf, 0x118e, "FSC Laptop", VIA_DXS_ENABLE), |
2370 | SND_PCI_QUIRK(0x1106, 0, "ASRock", VIA_DXS_SRC), | 2373 | SND_PCI_QUIRK_VENDOR(0x1106, "ASRock", VIA_DXS_SRC), |
2371 | SND_PCI_QUIRK(0x1297, 0xa231, "Shuttle AK31v2", VIA_DXS_SRC), | 2374 | SND_PCI_QUIRK(0x1297, 0xa231, "Shuttle AK31v2", VIA_DXS_SRC), |
2372 | SND_PCI_QUIRK(0x1297, 0xa232, "Shuttle", VIA_DXS_SRC), | 2375 | SND_PCI_QUIRK(0x1297, 0xa232, "Shuttle", VIA_DXS_SRC), |
2373 | SND_PCI_QUIRK(0x1297, 0xc160, "Shuttle Sk41G", VIA_DXS_SRC), | 2376 | SND_PCI_QUIRK(0x1297, 0xc160, "Shuttle Sk41G", VIA_DXS_SRC), |
@@ -2375,7 +2378,7 @@ static struct snd_pci_quirk dxs_whitelist[] __devinitdata = { | |||
2375 | SND_PCI_QUIRK(0x1462, 0x3800, "MSI KT266", VIA_DXS_ENABLE), | 2378 | SND_PCI_QUIRK(0x1462, 0x3800, "MSI KT266", VIA_DXS_ENABLE), |
2376 | SND_PCI_QUIRK(0x1462, 0x7120, "MSI KT4V", VIA_DXS_ENABLE), | 2379 | SND_PCI_QUIRK(0x1462, 0x7120, "MSI KT4V", VIA_DXS_ENABLE), |
2377 | SND_PCI_QUIRK(0x1462, 0x7142, "MSI K8MM-V", VIA_DXS_ENABLE), | 2380 | SND_PCI_QUIRK(0x1462, 0x7142, "MSI K8MM-V", VIA_DXS_ENABLE), |
2378 | SND_PCI_QUIRK(0x1462, 0, "MSI Mobo", VIA_DXS_SRC), | 2381 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI Mobo", VIA_DXS_SRC), |
2379 | SND_PCI_QUIRK(0x147b, 0x1401, "ABIT KD7(-RAID)", VIA_DXS_ENABLE), | 2382 | SND_PCI_QUIRK(0x147b, 0x1401, "ABIT KD7(-RAID)", VIA_DXS_ENABLE), |
2380 | SND_PCI_QUIRK(0x147b, 0x1411, "ABIT VA-20", VIA_DXS_ENABLE), | 2383 | SND_PCI_QUIRK(0x147b, 0x1411, "ABIT VA-20", VIA_DXS_ENABLE), |
2381 | SND_PCI_QUIRK(0x147b, 0x1413, "ABIT KV8 Pro", VIA_DXS_ENABLE), | 2384 | SND_PCI_QUIRK(0x147b, 0x1413, "ABIT KV8 Pro", VIA_DXS_ENABLE), |
@@ -2389,11 +2392,11 @@ static struct snd_pci_quirk dxs_whitelist[] __devinitdata = { | |||
2389 | SND_PCI_QUIRK(0x161f, 0x2032, "m680x machines", VIA_DXS_48K), | 2392 | SND_PCI_QUIRK(0x161f, 0x2032, "m680x machines", VIA_DXS_48K), |
2390 | SND_PCI_QUIRK(0x1631, 0xe004, "PB EasyNote 3174", VIA_DXS_ENABLE), | 2393 | SND_PCI_QUIRK(0x1631, 0xe004, "PB EasyNote 3174", VIA_DXS_ENABLE), |
2391 | SND_PCI_QUIRK(0x1695, 0x3005, "EPoX EP-8K9A", VIA_DXS_ENABLE), | 2394 | SND_PCI_QUIRK(0x1695, 0x3005, "EPoX EP-8K9A", VIA_DXS_ENABLE), |
2392 | SND_PCI_QUIRK(0x1695, 0, "EPoX mobo", VIA_DXS_SRC), | 2395 | SND_PCI_QUIRK_VENDOR(0x1695, "EPoX mobo", VIA_DXS_SRC), |
2393 | SND_PCI_QUIRK(0x16f3, 0, "Jetway K8", VIA_DXS_SRC), | 2396 | SND_PCI_QUIRK_VENDOR(0x16f3, "Jetway K8", VIA_DXS_SRC), |
2394 | SND_PCI_QUIRK(0x1734, 0, "FSC Laptop", VIA_DXS_SRC), | 2397 | SND_PCI_QUIRK_VENDOR(0x1734, "FSC Laptop", VIA_DXS_SRC), |
2395 | SND_PCI_QUIRK(0x1849, 0x3059, "ASRock K7VM2", VIA_DXS_NO_VRA), | 2398 | SND_PCI_QUIRK(0x1849, 0x3059, "ASRock K7VM2", VIA_DXS_NO_VRA), |
2396 | SND_PCI_QUIRK(0x1849, 0, "ASRock mobo", VIA_DXS_SRC), | 2399 | SND_PCI_QUIRK_VENDOR(0x1849, "ASRock mobo", VIA_DXS_SRC), |
2397 | SND_PCI_QUIRK(0x1919, 0x200a, "Soltek SL-K8", VIA_DXS_NO_VRA), | 2400 | SND_PCI_QUIRK(0x1919, 0x200a, "Soltek SL-K8", VIA_DXS_NO_VRA), |
2398 | SND_PCI_QUIRK(0x4005, 0x4710, "MSI K7T266", VIA_DXS_SRC), | 2401 | SND_PCI_QUIRK(0x4005, 0x4710, "MSI K7T266", VIA_DXS_SRC), |
2399 | { } /* terminator */ | 2402 | { } /* terminator */ |
diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index c086b762c150..0d54e3503c1e 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c | |||
@@ -328,7 +328,10 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre | |||
328 | flag = VIA_TBL_BIT_FLAG; /* period boundary */ | 328 | flag = VIA_TBL_BIT_FLAG; /* period boundary */ |
329 | } else | 329 | } else |
330 | flag = 0; /* period continues to the next */ | 330 | flag = 0; /* period continues to the next */ |
331 | // printk("via: tbl %d: at %d size %d (rest %d)\n", idx, ofs, r, rest); | 331 | /* |
332 | printk(KERN_DEBUG "via: tbl %d: at %d size %d " | ||
333 | "(rest %d)\n", idx, ofs, r, rest); | ||
334 | */ | ||
332 | ((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag); | 335 | ((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag); |
333 | dev->idx_table[idx].offset = ofs; | 336 | dev->idx_table[idx].offset = ofs; |
334 | dev->idx_table[idx].size = r; | 337 | dev->idx_table[idx].size = r; |
diff --git a/sound/pci/vx222/vx222_ops.c b/sound/pci/vx222/vx222_ops.c index 7e87f398ff0b..c0efe4491116 100644 --- a/sound/pci/vx222/vx222_ops.c +++ b/sound/pci/vx222/vx222_ops.c | |||
@@ -107,7 +107,9 @@ static unsigned char vx2_inb(struct vx_core *chip, int offset) | |||
107 | static void vx2_outb(struct vx_core *chip, int offset, unsigned char val) | 107 | static void vx2_outb(struct vx_core *chip, int offset, unsigned char val) |
108 | { | 108 | { |
109 | outb(val, vx2_reg_addr(chip, offset)); | 109 | outb(val, vx2_reg_addr(chip, offset)); |
110 | //printk("outb: %x -> %x\n", val, vx2_reg_addr(chip, offset)); | 110 | /* |
111 | printk(KERN_DEBUG "outb: %x -> %x\n", val, vx2_reg_addr(chip, offset)); | ||
112 | */ | ||
111 | } | 113 | } |
112 | 114 | ||
113 | /** | 115 | /** |
@@ -126,7 +128,9 @@ static unsigned int vx2_inl(struct vx_core *chip, int offset) | |||
126 | */ | 128 | */ |
127 | static void vx2_outl(struct vx_core *chip, int offset, unsigned int val) | 129 | static void vx2_outl(struct vx_core *chip, int offset, unsigned int val) |
128 | { | 130 | { |
129 | // printk("outl: %x -> %x\n", val, vx2_reg_addr(chip, offset)); | 131 | /* |
132 | printk(KERN_DEBUG "outl: %x -> %x\n", val, vx2_reg_addr(chip, offset)); | ||
133 | */ | ||
130 | outl(val, vx2_reg_addr(chip, offset)); | 134 | outl(val, vx2_reg_addr(chip, offset)); |
131 | } | 135 | } |
132 | 136 | ||
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 90d0d62bd0b4..2f0925236a1b 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c | |||
@@ -318,7 +318,12 @@ static void snd_ymfpci_pcm_interrupt(struct snd_ymfpci *chip, struct snd_ymfpci_ | |||
318 | ypcm->period_pos += delta; | 318 | ypcm->period_pos += delta; |
319 | ypcm->last_pos = pos; | 319 | ypcm->last_pos = pos; |
320 | if (ypcm->period_pos >= ypcm->period_size) { | 320 | if (ypcm->period_pos >= ypcm->period_size) { |
321 | // printk("done - active_bank = 0x%x, start = 0x%x\n", chip->active_bank, voice->bank[chip->active_bank].start); | 321 | /* |
322 | printk(KERN_DEBUG | ||
323 | "done - active_bank = 0x%x, start = 0x%x\n", | ||
324 | chip->active_bank, | ||
325 | voice->bank[chip->active_bank].start); | ||
326 | */ | ||
322 | ypcm->period_pos %= ypcm->period_size; | 327 | ypcm->period_pos %= ypcm->period_size; |
323 | spin_unlock(&chip->reg_lock); | 328 | spin_unlock(&chip->reg_lock); |
324 | snd_pcm_period_elapsed(ypcm->substream); | 329 | snd_pcm_period_elapsed(ypcm->substream); |
@@ -366,7 +371,12 @@ static void snd_ymfpci_pcm_capture_interrupt(struct snd_pcm_substream *substream | |||
366 | ypcm->last_pos = pos; | 371 | ypcm->last_pos = pos; |
367 | if (ypcm->period_pos >= ypcm->period_size) { | 372 | if (ypcm->period_pos >= ypcm->period_size) { |
368 | ypcm->period_pos %= ypcm->period_size; | 373 | ypcm->period_pos %= ypcm->period_size; |
369 | // printk("done - active_bank = 0x%x, start = 0x%x\n", chip->active_bank, voice->bank[chip->active_bank].start); | 374 | /* |
375 | printk(KERN_DEBUG | ||
376 | "done - active_bank = 0x%x, start = 0x%x\n", | ||
377 | chip->active_bank, | ||
378 | voice->bank[chip->active_bank].start); | ||
379 | */ | ||
370 | spin_unlock(&chip->reg_lock); | 380 | spin_unlock(&chip->reg_lock); |
371 | snd_pcm_period_elapsed(substream); | 381 | snd_pcm_period_elapsed(substream); |
372 | spin_lock(&chip->reg_lock); | 382 | spin_lock(&chip->reg_lock); |