diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/ac97/ac97_codec.c | 2 | ||||
-rw-r--r-- | sound/pci/ac97/ac97_patch.c | 2 | ||||
-rw-r--r-- | sound/pci/ca0106/ca0106.h | 12 | ||||
-rw-r--r-- | sound/pci/ca0106/ca0106_main.c | 15 | ||||
-rw-r--r-- | sound/pci/ca0106/ca0106_mixer.c | 2 | ||||
-rw-r--r-- | sound/pci/cs46xx/cs46xx_lib.c | 5 | ||||
-rw-r--r-- | sound/pci/emu10k1/emu10k1_main.c | 494 | ||||
-rw-r--r-- | sound/pci/hda/hda_beep.c | 8 | ||||
-rw-r--r-- | sound/pci/hda/hda_beep.h | 1 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 4 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 269 | ||||
-rw-r--r-- | sound/pci/ice1712/ice1724.c | 23 | ||||
-rw-r--r-- | sound/pci/mixart/mixart.c | 4 | ||||
-rw-r--r-- | sound/pci/pcxhr/pcxhr.c | 9 | ||||
-rw-r--r-- | sound/pci/riptide/riptide.c | 2 |
15 files changed, 518 insertions, 334 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index bd510eceff1f..e2b843b4f9d0 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -175,7 +175,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { | |||
175 | { 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q", patch_wolfson04, NULL}, | 175 | { 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q", patch_wolfson04, NULL}, |
176 | { 0x574d4C05, 0xffffffff, "WM9705,WM9710", patch_wolfson05, NULL}, | 176 | { 0x574d4C05, 0xffffffff, "WM9705,WM9710", patch_wolfson05, NULL}, |
177 | { 0x574d4C09, 0xffffffff, "WM9709", NULL, NULL}, | 177 | { 0x574d4C09, 0xffffffff, "WM9709", NULL, NULL}, |
178 | { 0x574d4C12, 0xffffffff, "WM9711,WM9712", patch_wolfson11, NULL}, | 178 | { 0x574d4C12, 0xffffffff, "WM9711,WM9712,WM9715", patch_wolfson11, NULL}, |
179 | { 0x574d4c13, 0xffffffff, "WM9713,WM9714", patch_wolfson13, NULL, AC97_DEFAULT_POWER_OFF}, | 179 | { 0x574d4c13, 0xffffffff, "WM9713,WM9714", patch_wolfson13, NULL, AC97_DEFAULT_POWER_OFF}, |
180 | { 0x594d4800, 0xffffffff, "YMF743", patch_yamaha_ymf743, NULL }, | 180 | { 0x594d4800, 0xffffffff, "YMF743", patch_yamaha_ymf743, NULL }, |
181 | { 0x594d4802, 0xffffffff, "YMF752", NULL, NULL }, | 181 | { 0x594d4802, 0xffffffff, "YMF752", NULL, NULL }, |
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c index 6e831aff1bd0..2c7cd97d2234 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c | |||
@@ -2832,6 +2832,8 @@ static int patch_alc655(struct snd_ac97 * ac97) | |||
2832 | val &= ~(1 << 1); /* Pin 47 is EAPD (for internal speaker) */ | 2832 | val &= ~(1 << 1); /* Pin 47 is EAPD (for internal speaker) */ |
2833 | else | 2833 | else |
2834 | val |= (1 << 1); /* Pin 47 is spdif input pin */ | 2834 | val |= (1 << 1); /* Pin 47 is spdif input pin */ |
2835 | /* this seems missing on some hardwares */ | ||
2836 | ac97->ext_id |= AC97_EI_SPDIF; | ||
2835 | } | 2837 | } |
2836 | val &= ~(1 << 12); /* vref enable */ | 2838 | val &= ~(1 << 12); /* vref enable */ |
2837 | snd_ac97_write_cache(ac97, 0x7a, val); | 2839 | snd_ac97_write_cache(ac97, 0x7a, val); |
diff --git a/sound/pci/ca0106/ca0106.h b/sound/pci/ca0106/ca0106.h index ec0f17ded4e0..14b8d9a91aae 100644 --- a/sound/pci/ca0106/ca0106.h +++ b/sound/pci/ca0106/ca0106.h | |||
@@ -664,10 +664,14 @@ struct snd_ca0106_pcm { | |||
664 | struct snd_ca0106_details { | 664 | struct snd_ca0106_details { |
665 | u32 serial; | 665 | u32 serial; |
666 | char * name; | 666 | char * name; |
667 | int ac97; | 667 | int ac97; /* ac97 = 0 -> Select MIC, Line in, TAD in, AUX in. |
668 | int gpio_type; | 668 | ac97 = 1 -> Default to AC97 in. */ |
669 | int i2c_adc; | 669 | int gpio_type; /* gpio_type = 1 -> shared mic-in/line-in |
670 | int spi_dac; | 670 | gpio_type = 2 -> shared side-out/line-in. */ |
671 | int i2c_adc; /* with i2c_adc=1, the driver adds some capture volume | ||
672 | controls, phone, mic, line-in and aux. */ | ||
673 | int spi_dac; /* spi_dac=1 adds the mute switch for each analog | ||
674 | output, front, rear, etc. */ | ||
671 | }; | 675 | }; |
672 | 676 | ||
673 | // definition of the chip-specific record | 677 | // definition of the chip-specific record |
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index c27fd90101d6..0e62205d4081 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c | |||
@@ -254,7 +254,7 @@ static struct snd_ca0106_details ca0106_chip_details[] = { | |||
254 | .name = "MSI K8N Diamond MB", | 254 | .name = "MSI K8N Diamond MB", |
255 | .gpio_type = 2, | 255 | .gpio_type = 2, |
256 | .i2c_adc = 1, | 256 | .i2c_adc = 1, |
257 | .spi_dac = 2 } , | 257 | .spi_dac = 1 } , |
258 | /* Shuttle XPC SD31P which has an onboard Creative Labs | 258 | /* Shuttle XPC SD31P which has an onboard Creative Labs |
259 | * Sound Blaster Live! 24-bit EAX | 259 | * Sound Blaster Live! 24-bit EAX |
260 | * high-definition 7.1 audio processor". | 260 | * high-definition 7.1 audio processor". |
@@ -305,9 +305,15 @@ static struct snd_pcm_hardware snd_ca0106_capture_hw = { | |||
305 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | 305 | SNDRV_PCM_INFO_BLOCK_TRANSFER | |
306 | SNDRV_PCM_INFO_MMAP_VALID), | 306 | SNDRV_PCM_INFO_MMAP_VALID), |
307 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, | 307 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, |
308 | #if 0 /* FIXME: looks like 44.1kHz capture causes noisy output on 48kHz */ | ||
308 | .rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | | 309 | .rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | |
309 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000), | 310 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000), |
310 | .rate_min = 44100, | 311 | .rate_min = 44100, |
312 | #else | ||
313 | .rates = (SNDRV_PCM_RATE_48000 | | ||
314 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000), | ||
315 | .rate_min = 48000, | ||
316 | #endif /* FIXME */ | ||
311 | .rate_max = 192000, | 317 | .rate_max = 192000, |
312 | .channels_min = 2, | 318 | .channels_min = 2, |
313 | .channels_max = 2, | 319 | .channels_max = 2, |
@@ -1708,6 +1714,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, | |||
1708 | err = snd_ca0106_create(dev, card, pci, &chip); | 1714 | err = snd_ca0106_create(dev, card, pci, &chip); |
1709 | if (err < 0) | 1715 | if (err < 0) |
1710 | goto error; | 1716 | goto error; |
1717 | card->private_data = chip; | ||
1711 | 1718 | ||
1712 | for (i = 0; i < 4; i++) { | 1719 | for (i = 0; i < 4; i++) { |
1713 | err = snd_ca0106_pcm(chip, i); | 1720 | err = snd_ca0106_pcm(chip, i); |
@@ -1766,7 +1773,8 @@ static int snd_ca0106_suspend(struct pci_dev *pci, pm_message_t state) | |||
1766 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | 1773 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
1767 | for (i = 0; i < 4; i++) | 1774 | for (i = 0; i < 4; i++) |
1768 | snd_pcm_suspend_all(chip->pcm[i]); | 1775 | snd_pcm_suspend_all(chip->pcm[i]); |
1769 | snd_ac97_suspend(chip->ac97); | 1776 | if (chip->details->ac97) |
1777 | snd_ac97_suspend(chip->ac97); | ||
1770 | snd_ca0106_mixer_suspend(chip); | 1778 | snd_ca0106_mixer_suspend(chip); |
1771 | 1779 | ||
1772 | ca0106_stop_chip(chip); | 1780 | ca0106_stop_chip(chip); |
@@ -1795,7 +1803,8 @@ static int snd_ca0106_resume(struct pci_dev *pci) | |||
1795 | 1803 | ||
1796 | ca0106_init_chip(chip, 1); | 1804 | ca0106_init_chip(chip, 1); |
1797 | 1805 | ||
1798 | snd_ac97_resume(chip->ac97); | 1806 | if (chip->details->ac97) |
1807 | snd_ac97_resume(chip->ac97); | ||
1799 | snd_ca0106_mixer_resume(chip); | 1808 | snd_ca0106_mixer_resume(chip); |
1800 | if (chip->details->spi_dac) { | 1809 | if (chip->details->spi_dac) { |
1801 | for (i = 0; i < ARRAY_SIZE(chip->spi_dac_reg); i++) | 1810 | for (i = 0; i < ARRAY_SIZE(chip->spi_dac_reg); i++) |
diff --git a/sound/pci/ca0106/ca0106_mixer.c b/sound/pci/ca0106/ca0106_mixer.c index 8727881a10b8..ad2888705d2a 100644 --- a/sound/pci/ca0106/ca0106_mixer.c +++ b/sound/pci/ca0106/ca0106_mixer.c | |||
@@ -855,8 +855,8 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu) | |||
855 | 855 | ||
856 | #ifdef CONFIG_PM | 856 | #ifdef CONFIG_PM |
857 | struct ca0106_vol_tbl { | 857 | struct ca0106_vol_tbl { |
858 | unsigned int reg; | ||
859 | unsigned int channel_id; | 858 | unsigned int channel_id; |
859 | unsigned int reg; | ||
860 | }; | 860 | }; |
861 | 861 | ||
862 | static struct ca0106_vol_tbl saved_volumes[NUM_SAVED_VOLUMES] = { | 862 | static struct ca0106_vol_tbl saved_volumes[NUM_SAVED_VOLUMES] = { |
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index fb6dc3980257..8ab07aa63652 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c | |||
@@ -3640,7 +3640,10 @@ int snd_cs46xx_resume(struct pci_dev *pci) | |||
3640 | { | 3640 | { |
3641 | struct snd_card *card = pci_get_drvdata(pci); | 3641 | struct snd_card *card = pci_get_drvdata(pci); |
3642 | struct snd_cs46xx *chip = card->private_data; | 3642 | struct snd_cs46xx *chip = card->private_data; |
3643 | int i, amp_saved; | 3643 | int amp_saved; |
3644 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | ||
3645 | int i; | ||
3646 | #endif | ||
3644 | 3647 | ||
3645 | pci_set_power_state(pci, PCI_D0); | 3648 | pci_set_power_state(pci, PCI_D0); |
3646 | pci_restore_state(pci); | 3649 | pci_restore_state(pci); |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index de5ee8f097f6..7958006a1d66 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
@@ -69,7 +69,7 @@ MODULE_FIRMWARE(EMU1010_NOTEBOOK_FILENAME); | |||
69 | * EMU10K1 init / done | 69 | * EMU10K1 init / done |
70 | *************************************************************************/ | 70 | *************************************************************************/ |
71 | 71 | ||
72 | void snd_emu10k1_voice_init(struct snd_emu10k1 * emu, int ch) | 72 | void snd_emu10k1_voice_init(struct snd_emu10k1 *emu, int ch) |
73 | { | 73 | { |
74 | snd_emu10k1_ptr_write(emu, DCYSUSV, ch, 0); | 74 | snd_emu10k1_ptr_write(emu, DCYSUSV, ch, 0); |
75 | snd_emu10k1_ptr_write(emu, IP, ch, 0); | 75 | snd_emu10k1_ptr_write(emu, IP, ch, 0); |
@@ -151,9 +151,9 @@ static unsigned int i2c_adc_init[][2] = { | |||
151 | { 0x12, 0x32 }, /* ALC Control 3 */ | 151 | { 0x12, 0x32 }, /* ALC Control 3 */ |
152 | { 0x13, 0x00 }, /* Noise gate control */ | 152 | { 0x13, 0x00 }, /* Noise gate control */ |
153 | { 0x14, 0xa6 }, /* Limiter control */ | 153 | { 0x14, 0xa6 }, /* Limiter control */ |
154 | { 0x15, ADC_MUX_2 }, /* ADC Mixer control. Mic for Audigy 2 ZS Notebook */ | 154 | { 0x15, ADC_MUX_2 }, /* ADC Mixer control. Mic for A2ZS Notebook */ |
155 | }; | 155 | }; |
156 | 156 | ||
157 | static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | 157 | static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) |
158 | { | 158 | { |
159 | unsigned int silent_page; | 159 | unsigned int silent_page; |
@@ -161,8 +161,8 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
161 | u32 tmp; | 161 | u32 tmp; |
162 | 162 | ||
163 | /* disable audio and lock cache */ | 163 | /* disable audio and lock cache */ |
164 | outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE, | 164 | outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | |
165 | emu->port + HCFG); | 165 | HCFG_MUTEBUTTONENABLE, emu->port + HCFG); |
166 | 166 | ||
167 | /* reset recording buffers */ | 167 | /* reset recording buffers */ |
168 | snd_emu10k1_ptr_write(emu, MICBS, 0, ADCBS_BUFSIZE_NONE); | 168 | snd_emu10k1_ptr_write(emu, MICBS, 0, ADCBS_BUFSIZE_NONE); |
@@ -179,7 +179,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
179 | snd_emu10k1_ptr_write(emu, SOLEL, 0, 0); | 179 | snd_emu10k1_ptr_write(emu, SOLEL, 0, 0); |
180 | snd_emu10k1_ptr_write(emu, SOLEH, 0, 0); | 180 | snd_emu10k1_ptr_write(emu, SOLEH, 0, 0); |
181 | 181 | ||
182 | if (emu->audigy){ | 182 | if (emu->audigy) { |
183 | /* set SPDIF bypass mode */ | 183 | /* set SPDIF bypass mode */ |
184 | snd_emu10k1_ptr_write(emu, SPBYPASS, 0, SPBYPASS_FORMAT); | 184 | snd_emu10k1_ptr_write(emu, SPBYPASS, 0, SPBYPASS_FORMAT); |
185 | /* enable rear left + rear right AC97 slots */ | 185 | /* enable rear left + rear right AC97 slots */ |
@@ -197,12 +197,12 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
197 | 197 | ||
198 | if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ | 198 | if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ |
199 | /* Hacks for Alice3 to work independent of haP16V driver */ | 199 | /* Hacks for Alice3 to work independent of haP16V driver */ |
200 | //Setup SRCMulti_I2S SamplingRate | 200 | /* Setup SRCMulti_I2S SamplingRate */ |
201 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0); | 201 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0); |
202 | tmp &= 0xfffff1ff; | 202 | tmp &= 0xfffff1ff; |
203 | tmp |= (0x2<<9); | 203 | tmp |= (0x2<<9); |
204 | snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp); | 204 | snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp); |
205 | 205 | ||
206 | /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */ | 206 | /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */ |
207 | snd_emu10k1_ptr20_write(emu, SRCSel, 0, 0x14); | 207 | snd_emu10k1_ptr20_write(emu, SRCSel, 0, 0x14); |
208 | /* Setup SRCMulti Input Audio Enable */ | 208 | /* Setup SRCMulti Input Audio Enable */ |
@@ -217,7 +217,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
217 | if (emu->card_capabilities->ca0108_chip) { /* audigy2 Value */ | 217 | if (emu->card_capabilities->ca0108_chip) { /* audigy2 Value */ |
218 | /* Hacks for Alice3 to work independent of haP16V driver */ | 218 | /* Hacks for Alice3 to work independent of haP16V driver */ |
219 | snd_printk(KERN_INFO "Audigy2 value: Special config.\n"); | 219 | snd_printk(KERN_INFO "Audigy2 value: Special config.\n"); |
220 | //Setup SRCMulti_I2S SamplingRate | 220 | /* Setup SRCMulti_I2S SamplingRate */ |
221 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0); | 221 | tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0); |
222 | tmp &= 0xfffff1ff; | 222 | tmp &= 0xfffff1ff; |
223 | tmp |= (0x2<<9); | 223 | tmp |= (0x2<<9); |
@@ -270,13 +270,13 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
270 | size = ARRAY_SIZE(i2c_adc_init); | 270 | size = ARRAY_SIZE(i2c_adc_init); |
271 | for (n = 0; n < size; n++) | 271 | for (n = 0; n < size; n++) |
272 | snd_emu10k1_i2c_write(emu, i2c_adc_init[n][0], i2c_adc_init[n][1]); | 272 | snd_emu10k1_i2c_write(emu, i2c_adc_init[n][0], i2c_adc_init[n][1]); |
273 | for (n=0; n < 4; n++) { | 273 | for (n = 0; n < 4; n++) { |
274 | emu->i2c_capture_volume[n][0]= 0xcf; | 274 | emu->i2c_capture_volume[n][0] = 0xcf; |
275 | emu->i2c_capture_volume[n][1]= 0xcf; | 275 | emu->i2c_capture_volume[n][1] = 0xcf; |
276 | } | 276 | } |
277 | } | 277 | } |
278 | 278 | ||
279 | 279 | ||
280 | snd_emu10k1_ptr_write(emu, PTB, 0, emu->ptb_pages.addr); | 280 | snd_emu10k1_ptr_write(emu, PTB, 0, emu->ptb_pages.addr); |
281 | snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */ | 281 | snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */ |
282 | snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */ | 282 | snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */ |
@@ -313,7 +313,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
313 | (emu->model == 0x21 && emu->revision < 6)) | 313 | (emu->model == 0x21 && emu->revision < 6)) |
314 | outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE, emu->port + HCFG); | 314 | outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE, emu->port + HCFG); |
315 | else | 315 | else |
316 | // With on-chip joystick | 316 | /* With on-chip joystick */ |
317 | outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); | 317 | outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); |
318 | 318 | ||
319 | if (enable_ir) { /* enable IR for SB Live */ | 319 | if (enable_ir) { /* enable IR for SB Live */ |
@@ -335,9 +335,9 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) | |||
335 | outl(reg | HCFG_GPOUT1 | HCFG_GPOUT2, emu->port + HCFG); | 335 | outl(reg | HCFG_GPOUT1 | HCFG_GPOUT2, emu->port + HCFG); |
336 | udelay(100); | 336 | udelay(100); |
337 | outl(reg, emu->port + HCFG); | 337 | outl(reg, emu->port + HCFG); |
338 | } | 338 | } |
339 | } | 339 | } |
340 | 340 | ||
341 | if (emu->card_capabilities->emu_model) { | 341 | if (emu->card_capabilities->emu_model) { |
342 | ; /* Disable all access to A_IOCFG for the emu1010 */ | 342 | ; /* Disable all access to A_IOCFG for the emu1010 */ |
343 | } else if (emu->card_capabilities->i2c_adc) { | 343 | } else if (emu->card_capabilities->i2c_adc) { |
@@ -364,7 +364,7 @@ static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu) | |||
364 | ; /* Disable A_IOCFG for Audigy 2 ZS Notebook */ | 364 | ; /* Disable A_IOCFG for Audigy 2 ZS Notebook */ |
365 | } else if (emu->audigy) { | 365 | } else if (emu->audigy) { |
366 | outl(inl(emu->port + A_IOCFG) & ~0x44, emu->port + A_IOCFG); | 366 | outl(inl(emu->port + A_IOCFG) & ~0x44, emu->port + A_IOCFG); |
367 | 367 | ||
368 | if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ | 368 | if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ |
369 | /* Unmute Analog now. Set GPO6 to 1 for Apollo. | 369 | /* Unmute Analog now. Set GPO6 to 1 for Apollo. |
370 | * This has to be done after init ALice3 I2SOut beyond 48KHz. | 370 | * This has to be done after init ALice3 I2SOut beyond 48KHz. |
@@ -378,12 +378,12 @@ static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu) | |||
378 | outl(inl(emu->port + A_IOCFG) | 0x0080, emu->port + A_IOCFG); | 378 | outl(inl(emu->port + A_IOCFG) | 0x0080, emu->port + A_IOCFG); |
379 | } | 379 | } |
380 | } | 380 | } |
381 | 381 | ||
382 | #if 0 | 382 | #if 0 |
383 | { | 383 | { |
384 | unsigned int tmp; | 384 | unsigned int tmp; |
385 | /* FIXME: the following routine disables LiveDrive-II !! */ | 385 | /* FIXME: the following routine disables LiveDrive-II !! */ |
386 | // TOSLink detection | 386 | /* TOSLink detection */ |
387 | emu->tos_link = 0; | 387 | emu->tos_link = 0; |
388 | tmp = inl(emu->port + HCFG); | 388 | tmp = inl(emu->port + HCFG); |
389 | if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) { | 389 | if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) { |
@@ -400,7 +400,7 @@ static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu) | |||
400 | snd_emu10k1_intr_enable(emu, INTE_PCIERRORENABLE); | 400 | snd_emu10k1_intr_enable(emu, INTE_PCIERRORENABLE); |
401 | } | 401 | } |
402 | 402 | ||
403 | int snd_emu10k1_done(struct snd_emu10k1 * emu) | 403 | int snd_emu10k1_done(struct snd_emu10k1 *emu) |
404 | { | 404 | { |
405 | int ch; | 405 | int ch; |
406 | 406 | ||
@@ -495,7 +495,7 @@ int snd_emu10k1_done(struct snd_emu10k1 * emu) | |||
495 | 495 | ||
496 | #define EC_LAST_PROMFILE_ADDR 0x2f | 496 | #define EC_LAST_PROMFILE_ADDR 0x2f |
497 | 497 | ||
498 | #define EC_SERIALNUM_ADDR 0x30 /* First word of serial number. The | 498 | #define EC_SERIALNUM_ADDR 0x30 /* First word of serial number. The |
499 | * can be up to 30 characters in length | 499 | * can be up to 30 characters in length |
500 | * and is stored as a NULL-terminated | 500 | * and is stored as a NULL-terminated |
501 | * ASCII string. Any unused bytes must be | 501 | * ASCII string. Any unused bytes must be |
@@ -503,8 +503,8 @@ int snd_emu10k1_done(struct snd_emu10k1 * emu) | |||
503 | #define EC_CHECKSUM_ADDR 0x3f /* Location at which checksum is stored */ | 503 | #define EC_CHECKSUM_ADDR 0x3f /* Location at which checksum is stored */ |
504 | 504 | ||
505 | 505 | ||
506 | /* Most of this stuff is pretty self-evident. According to the hardware | 506 | /* Most of this stuff is pretty self-evident. According to the hardware |
507 | * dudes, we need to leave the ADCCAL bit low in order to avoid a DC | 507 | * dudes, we need to leave the ADCCAL bit low in order to avoid a DC |
508 | * offset problem. Weird. | 508 | * offset problem. Weird. |
509 | */ | 509 | */ |
510 | #define EC_RAW_RUN_MODE (EC_DACMUTEN | EC_ADCRSTN | EC_TRIM_MUTEN | \ | 510 | #define EC_RAW_RUN_MODE (EC_DACMUTEN | EC_ADCRSTN | EC_TRIM_MUTEN | \ |
@@ -523,7 +523,7 @@ int snd_emu10k1_done(struct snd_emu10k1 * emu) | |||
523 | * register. | 523 | * register. |
524 | */ | 524 | */ |
525 | 525 | ||
526 | static void snd_emu10k1_ecard_write(struct snd_emu10k1 * emu, unsigned int value) | 526 | static void snd_emu10k1_ecard_write(struct snd_emu10k1 *emu, unsigned int value) |
527 | { | 527 | { |
528 | unsigned short count; | 528 | unsigned short count; |
529 | unsigned int data; | 529 | unsigned int data; |
@@ -561,7 +561,7 @@ static void snd_emu10k1_ecard_write(struct snd_emu10k1 * emu, unsigned int value | |||
561 | * channel. | 561 | * channel. |
562 | */ | 562 | */ |
563 | 563 | ||
564 | static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu, | 564 | static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 *emu, |
565 | unsigned short gain) | 565 | unsigned short gain) |
566 | { | 566 | { |
567 | unsigned int bit; | 567 | unsigned int bit; |
@@ -574,7 +574,7 @@ static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu, | |||
574 | 574 | ||
575 | for (bit = (1 << 15); bit; bit >>= 1) { | 575 | for (bit = (1 << 15); bit; bit >>= 1) { |
576 | unsigned int value; | 576 | unsigned int value; |
577 | 577 | ||
578 | value = emu->ecard_ctrl & ~(EC_TRIM_CSN | EC_TRIM_SDATA); | 578 | value = emu->ecard_ctrl & ~(EC_TRIM_CSN | EC_TRIM_SDATA); |
579 | 579 | ||
580 | if (gain & bit) | 580 | if (gain & bit) |
@@ -589,7 +589,7 @@ static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu, | |||
589 | snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); | 589 | snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); |
590 | } | 590 | } |
591 | 591 | ||
592 | static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) | 592 | static int snd_emu10k1_ecard_init(struct snd_emu10k1 *emu) |
593 | { | 593 | { |
594 | unsigned int hc_value; | 594 | unsigned int hc_value; |
595 | 595 | ||
@@ -598,7 +598,7 @@ static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) | |||
598 | EC_SPDIF0_SELECT(EC_DEFAULT_SPDIF0_SEL) | | 598 | EC_SPDIF0_SELECT(EC_DEFAULT_SPDIF0_SEL) | |
599 | EC_SPDIF1_SELECT(EC_DEFAULT_SPDIF1_SEL); | 599 | EC_SPDIF1_SELECT(EC_DEFAULT_SPDIF1_SEL); |
600 | 600 | ||
601 | /* Step 0: Set the codec type in the hardware control register | 601 | /* Step 0: Set the codec type in the hardware control register |
602 | * and enable audio output */ | 602 | * and enable audio output */ |
603 | hc_value = inl(emu->port + HCFG); | 603 | hc_value = inl(emu->port + HCFG); |
604 | outl(hc_value | HCFG_AUDIOENABLE | HCFG_CODECFORMAT_I2S, emu->port + HCFG); | 604 | outl(hc_value | HCFG_AUDIOENABLE | HCFG_CODECFORMAT_I2S, emu->port + HCFG); |
@@ -629,7 +629,7 @@ static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) | |||
629 | return 0; | 629 | return 0; |
630 | } | 630 | } |
631 | 631 | ||
632 | static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) | 632 | static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu) |
633 | { | 633 | { |
634 | unsigned long special_port; | 634 | unsigned long special_port; |
635 | unsigned int value; | 635 | unsigned int value; |
@@ -656,7 +656,7 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) | |||
656 | return 0; | 656 | return 0; |
657 | } | 657 | } |
658 | 658 | ||
659 | static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * filename) | 659 | static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, const char *filename) |
660 | { | 660 | { |
661 | int err; | 661 | int err; |
662 | int n, i; | 662 | int n, i; |
@@ -666,11 +666,12 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file | |||
666 | unsigned long flags; | 666 | unsigned long flags; |
667 | const struct firmware *fw_entry; | 667 | const struct firmware *fw_entry; |
668 | 668 | ||
669 | if ((err = request_firmware(&fw_entry, filename, &emu->pci->dev)) != 0) { | 669 | err = request_firmware(&fw_entry, filename, &emu->pci->dev); |
670 | snd_printk(KERN_ERR "firmware: %s not found. Err=%d\n",filename, err); | 670 | if (err != 0) { |
671 | snd_printk(KERN_ERR "firmware: %s not found. Err = %d\n", filename, err); | ||
671 | return err; | 672 | return err; |
672 | } | 673 | } |
673 | snd_printk(KERN_INFO "firmware size=0x%zx\n", fw_entry->size); | 674 | snd_printk(KERN_INFO "firmware size = 0x%zx\n", fw_entry->size); |
674 | 675 | ||
675 | /* The FPGA is a Xilinx Spartan IIE XC2S50E */ | 676 | /* The FPGA is a Xilinx Spartan IIE XC2S50E */ |
676 | /* GPIO7 -> FPGA PGMN | 677 | /* GPIO7 -> FPGA PGMN |
@@ -685,13 +686,13 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file | |||
685 | outl(0x80, emu->port + A_IOCFG); /* Leave bit 7 set during netlist setup. */ | 686 | outl(0x80, emu->port + A_IOCFG); /* Leave bit 7 set during netlist setup. */ |
686 | write_post = inl(emu->port + A_IOCFG); | 687 | write_post = inl(emu->port + A_IOCFG); |
687 | udelay(100); /* Allow FPGA memory to clean */ | 688 | udelay(100); /* Allow FPGA memory to clean */ |
688 | for(n = 0; n < fw_entry->size; n++) { | 689 | for (n = 0; n < fw_entry->size; n++) { |
689 | value=fw_entry->data[n]; | 690 | value = fw_entry->data[n]; |
690 | for(i = 0; i < 8; i++) { | 691 | for (i = 0; i < 8; i++) { |
691 | reg = 0x80; | 692 | reg = 0x80; |
692 | if (value & 0x1) | 693 | if (value & 0x1) |
693 | reg = reg | 0x20; | 694 | reg = reg | 0x20; |
694 | value = value >> 1; | 695 | value = value >> 1; |
695 | outl(reg, emu->port + A_IOCFG); | 696 | outl(reg, emu->port + A_IOCFG); |
696 | write_post = inl(emu->port + A_IOCFG); | 697 | write_post = inl(emu->port + A_IOCFG); |
697 | outl(reg | 0x40, emu->port + A_IOCFG); | 698 | outl(reg | 0x40, emu->port + A_IOCFG); |
@@ -703,14 +704,14 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file | |||
703 | write_post = inl(emu->port + A_IOCFG); | 704 | write_post = inl(emu->port + A_IOCFG); |
704 | spin_unlock_irqrestore(&emu->emu_lock, flags); | 705 | spin_unlock_irqrestore(&emu->emu_lock, flags); |
705 | 706 | ||
706 | release_firmware(fw_entry); | 707 | release_firmware(fw_entry); |
707 | return 0; | 708 | return 0; |
708 | } | 709 | } |
709 | 710 | ||
710 | static int emu1010_firmware_thread(void *data) | 711 | static int emu1010_firmware_thread(void *data) |
711 | { | 712 | { |
712 | struct snd_emu10k1 * emu = data; | 713 | struct snd_emu10k1 *emu = data; |
713 | int tmp,tmp2; | 714 | int tmp, tmp2; |
714 | int reg; | 715 | int reg; |
715 | int err; | 716 | int err; |
716 | 717 | ||
@@ -719,50 +720,50 @@ static int emu1010_firmware_thread(void *data) | |||
719 | msleep_interruptible(1000); | 720 | msleep_interruptible(1000); |
720 | if (kthread_should_stop()) | 721 | if (kthread_should_stop()) |
721 | break; | 722 | break; |
722 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &tmp ); /* IRQ Status */ | 723 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &tmp); /* IRQ Status */ |
723 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ® ); /* OPTIONS: Which cards are attached to the EMU */ | 724 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®); /* OPTIONS: Which cards are attached to the EMU */ |
724 | if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) { | 725 | if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) { |
725 | /* Audio Dock attached */ | 726 | /* Audio Dock attached */ |
726 | /* Return to Audio Dock programming mode */ | 727 | /* Return to Audio Dock programming mode */ |
727 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); | 728 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); |
728 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK ); | 729 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK); |
729 | if (emu->card_capabilities->emu_model == | 730 | if (emu->card_capabilities->emu_model == |
730 | EMU_MODEL_EMU1010) { | 731 | EMU_MODEL_EMU1010) { |
731 | if ((err = snd_emu1010_load_firmware(emu, DOCK_FILENAME)) != 0) { | 732 | err = snd_emu1010_load_firmware(emu, DOCK_FILENAME); |
733 | if (err != 0) | ||
732 | continue; | 734 | continue; |
733 | } | ||
734 | } else if (emu->card_capabilities->emu_model == | 735 | } else if (emu->card_capabilities->emu_model == |
735 | EMU_MODEL_EMU1010B) { | 736 | EMU_MODEL_EMU1010B) { |
736 | if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) { | 737 | err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME); |
738 | if (err != 0) | ||
737 | continue; | 739 | continue; |
738 | } | ||
739 | } else if (emu->card_capabilities->emu_model == | 740 | } else if (emu->card_capabilities->emu_model == |
740 | EMU_MODEL_EMU1616) { | 741 | EMU_MODEL_EMU1616) { |
741 | if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) { | 742 | err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME); |
743 | if (err != 0) | ||
742 | continue; | 744 | continue; |
743 | } | ||
744 | } | 745 | } |
745 | 746 | ||
746 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0 ); | 747 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0); |
747 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, ® ); | 748 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, ®); |
748 | snd_printk(KERN_INFO "emu1010: EMU_HANA+DOCK_IRQ_STATUS=0x%x\n",reg); | 749 | snd_printk(KERN_INFO "emu1010: EMU_HANA+DOCK_IRQ_STATUS = 0x%x\n", reg); |
749 | /* ID, should read & 0x7f = 0x55 when FPGA programmed. */ | 750 | /* ID, should read & 0x7f = 0x55 when FPGA programmed. */ |
750 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ® ); | 751 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ®); |
751 | snd_printk(KERN_INFO "emu1010: EMU_HANA+DOCK_ID=0x%x\n",reg); | 752 | snd_printk(KERN_INFO "emu1010: EMU_HANA+DOCK_ID = 0x%x\n", reg); |
752 | if ((reg & 0x1f) != 0x15) { | 753 | if ((reg & 0x1f) != 0x15) { |
753 | /* FPGA failed to be programmed */ | 754 | /* FPGA failed to be programmed */ |
754 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware file failed, reg=0x%x\n", reg); | 755 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware file failed, reg = 0x%x\n", reg); |
755 | continue; | 756 | continue; |
756 | } | 757 | } |
757 | snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n"); | 758 | snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n"); |
758 | snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp ); | 759 | snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp); |
759 | snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2 ); | 760 | snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2); |
760 | snd_printk("Audio Dock ver:%d.%d\n",tmp ,tmp2); | 761 | snd_printk("Audio Dock ver:%d.%d\n", tmp, tmp2); |
761 | /* Sync clocking between 1010 and Dock */ | 762 | /* Sync clocking between 1010 and Dock */ |
762 | /* Allow DLL to settle */ | 763 | /* Allow DLL to settle */ |
763 | msleep(10); | 764 | msleep(10); |
764 | /* Unmute all. Default is muted after a firmware load */ | 765 | /* Unmute all. Default is muted after a firmware load */ |
765 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); | 766 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE); |
766 | } | 767 | } |
767 | } | 768 | } |
768 | snd_printk(KERN_INFO "emu1010: firmware thread stopping\n"); | 769 | snd_printk(KERN_INFO "emu1010: firmware thread stopping\n"); |
@@ -800,10 +801,10 @@ static int emu1010_firmware_thread(void *data) | |||
800 | * 16 x 16-bit playback - snd_emu10k1_fx8010_playback_ops | 801 | * 16 x 16-bit playback - snd_emu10k1_fx8010_playback_ops |
801 | * 16 x 32-bit capture - snd_emu10k1_capture_efx_ops | 802 | * 16 x 32-bit capture - snd_emu10k1_capture_efx_ops |
802 | */ | 803 | */ |
803 | static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | 804 | static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) |
804 | { | 805 | { |
805 | unsigned int i; | 806 | unsigned int i; |
806 | int tmp,tmp2; | 807 | int tmp, tmp2; |
807 | int reg; | 808 | int reg; |
808 | int err; | 809 | int err; |
809 | const char *filename = NULL; | 810 | const char *filename = NULL; |
@@ -818,7 +819,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
818 | * Lock Tank Memory Cache, | 819 | * Lock Tank Memory Cache, |
819 | * Mute all codecs. | 820 | * Mute all codecs. |
820 | */ | 821 | */ |
821 | outl(0x0005a004, emu->port + HCFG); | 822 | outl(0x0005a004, emu->port + HCFG); |
822 | /* AC97 2.1, Any 16Meg of 4Gig address, Auto-Mute, EMU32 Slave, | 823 | /* AC97 2.1, Any 16Meg of 4Gig address, Auto-Mute, EMU32 Slave, |
823 | * Mute all codecs. | 824 | * Mute all codecs. |
824 | */ | 825 | */ |
@@ -829,25 +830,25 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
829 | outl(0x0005a000, emu->port + HCFG); | 830 | outl(0x0005a000, emu->port + HCFG); |
830 | 831 | ||
831 | /* Disable 48Volt power to Audio Dock */ | 832 | /* Disable 48Volt power to Audio Dock */ |
832 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0 ); | 833 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0); |
833 | 834 | ||
834 | /* ID, should read & 0x7f = 0x55. (Bit 7 is the IRQ bit) */ | 835 | /* ID, should read & 0x7f = 0x55. (Bit 7 is the IRQ bit) */ |
835 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ® ); | 836 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ®); |
836 | snd_printdd("reg1=0x%x\n",reg); | 837 | snd_printdd("reg1 = 0x%x\n", reg); |
837 | if ((reg & 0x3f) == 0x15) { | 838 | if ((reg & 0x3f) == 0x15) { |
838 | /* FPGA netlist already present so clear it */ | 839 | /* FPGA netlist already present so clear it */ |
839 | /* Return to programming mode */ | 840 | /* Return to programming mode */ |
840 | 841 | ||
841 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0x02 ); | 842 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0x02); |
842 | } | 843 | } |
843 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ® ); | 844 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ®); |
844 | snd_printdd("reg2=0x%x\n",reg); | 845 | snd_printdd("reg2 = 0x%x\n", reg); |
845 | if ((reg & 0x3f) == 0x15) { | 846 | if ((reg & 0x3f) == 0x15) { |
846 | /* FPGA failed to return to programming mode */ | 847 | /* FPGA failed to return to programming mode */ |
847 | snd_printk(KERN_INFO "emu1010: FPGA failed to return to programming mode\n"); | 848 | snd_printk(KERN_INFO "emu1010: FPGA failed to return to programming mode\n"); |
848 | return -ENODEV; | 849 | return -ENODEV; |
849 | } | 850 | } |
850 | snd_printk(KERN_INFO "emu1010: EMU_HANA_ID=0x%x\n",reg); | 851 | snd_printk(KERN_INFO "emu1010: EMU_HANA_ID = 0x%x\n", reg); |
851 | switch (emu->card_capabilities->emu_model) { | 852 | switch (emu->card_capabilities->emu_model) { |
852 | case EMU_MODEL_EMU1010: | 853 | case EMU_MODEL_EMU1010: |
853 | filename = HANA_FILENAME; | 854 | filename = HANA_FILENAME; |
@@ -876,25 +877,25 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
876 | } | 877 | } |
877 | 878 | ||
878 | /* ID, should read & 0x7f = 0x55 when FPGA programmed. */ | 879 | /* ID, should read & 0x7f = 0x55 when FPGA programmed. */ |
879 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ® ); | 880 | snd_emu1010_fpga_read(emu, EMU_HANA_ID, ®); |
880 | if ((reg & 0x3f) != 0x15) { | 881 | if ((reg & 0x3f) != 0x15) { |
881 | /* FPGA failed to be programmed */ | 882 | /* FPGA failed to be programmed */ |
882 | snd_printk(KERN_INFO "emu1010: Loading Hana Firmware file failed, reg=0x%x\n", reg); | 883 | snd_printk(KERN_INFO "emu1010: Loading Hana Firmware file failed, reg = 0x%x\n", reg); |
883 | return -ENODEV; | 884 | return -ENODEV; |
884 | } | 885 | } |
885 | 886 | ||
886 | snd_printk(KERN_INFO "emu1010: Hana Firmware loaded\n"); | 887 | snd_printk(KERN_INFO "emu1010: Hana Firmware loaded\n"); |
887 | snd_emu1010_fpga_read(emu, EMU_HANA_MAJOR_REV, &tmp ); | 888 | snd_emu1010_fpga_read(emu, EMU_HANA_MAJOR_REV, &tmp); |
888 | snd_emu1010_fpga_read(emu, EMU_HANA_MINOR_REV, &tmp2 ); | 889 | snd_emu1010_fpga_read(emu, EMU_HANA_MINOR_REV, &tmp2); |
889 | snd_printk("Hana ver:%d.%d\n",tmp ,tmp2); | 890 | snd_printk("emu1010: Hana version: %d.%d\n", tmp, tmp2); |
890 | /* Enable 48Volt power to Audio Dock */ | 891 | /* Enable 48Volt power to Audio Dock */ |
891 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, EMU_HANA_DOCK_PWR_ON ); | 892 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, EMU_HANA_DOCK_PWR_ON); |
892 | 893 | ||
893 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ® ); | 894 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®); |
894 | snd_printk(KERN_INFO "emu1010: Card options=0x%x\n",reg); | 895 | snd_printk(KERN_INFO "emu1010: Card options = 0x%x\n", reg); |
895 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ® ); | 896 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®); |
896 | snd_printk(KERN_INFO "emu1010: Card options=0x%x\n",reg); | 897 | snd_printk(KERN_INFO "emu1010: Card options = 0x%x\n", reg); |
897 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTICAL_TYPE, &tmp ); | 898 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTICAL_TYPE, &tmp); |
898 | /* Optical -> ADAT I/O */ | 899 | /* Optical -> ADAT I/O */ |
899 | /* 0 : SPDIF | 900 | /* 0 : SPDIF |
900 | * 1 : ADAT | 901 | * 1 : ADAT |
@@ -904,41 +905,42 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
904 | tmp = 0; | 905 | tmp = 0; |
905 | tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) | | 906 | tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) | |
906 | (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0); | 907 | (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0); |
907 | snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp ); | 908 | snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp); |
908 | snd_emu1010_fpga_read(emu, EMU_HANA_ADC_PADS, &tmp ); | 909 | snd_emu1010_fpga_read(emu, EMU_HANA_ADC_PADS, &tmp); |
909 | /* Set no attenuation on Audio Dock pads. */ | 910 | /* Set no attenuation on Audio Dock pads. */ |
910 | snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, 0x00 ); | 911 | snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, 0x00); |
911 | emu->emu1010.adc_pads = 0x00; | 912 | emu->emu1010.adc_pads = 0x00; |
912 | snd_emu1010_fpga_read(emu, EMU_HANA_DOCK_MISC, &tmp ); | 913 | snd_emu1010_fpga_read(emu, EMU_HANA_DOCK_MISC, &tmp); |
913 | /* Unmute Audio dock DACs, Headphone source DAC-4. */ | 914 | /* Unmute Audio dock DACs, Headphone source DAC-4. */ |
914 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_MISC, 0x30 ); | 915 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_MISC, 0x30); |
915 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12 ); | 916 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12); |
916 | snd_emu1010_fpga_read(emu, EMU_HANA_DAC_PADS, &tmp ); | 917 | snd_emu1010_fpga_read(emu, EMU_HANA_DAC_PADS, &tmp); |
917 | /* DAC PADs. */ | 918 | /* DAC PADs. */ |
918 | snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, 0x0f ); | 919 | snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, 0x0f); |
919 | emu->emu1010.dac_pads = 0x0f; | 920 | emu->emu1010.dac_pads = 0x0f; |
920 | snd_emu1010_fpga_read(emu, EMU_HANA_DOCK_MISC, &tmp ); | 921 | snd_emu1010_fpga_read(emu, EMU_HANA_DOCK_MISC, &tmp); |
921 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_MISC, 0x30 ); | 922 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_MISC, 0x30); |
922 | snd_emu1010_fpga_read(emu, EMU_HANA_SPDIF_MODE, &tmp ); | 923 | snd_emu1010_fpga_read(emu, EMU_HANA_SPDIF_MODE, &tmp); |
923 | /* SPDIF Format. Set Consumer mode, 24bit, copy enable */ | 924 | /* SPDIF Format. Set Consumer mode, 24bit, copy enable */ |
924 | snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, 0x10 ); | 925 | snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, 0x10); |
925 | /* MIDI routing */ | 926 | /* MIDI routing */ |
926 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19 ); | 927 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19); |
927 | /* Unknown. */ | 928 | /* Unknown. */ |
928 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c ); | 929 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c); |
929 | /* snd_emu1010_fpga_write(emu, 0x09, 0x0f ); // IRQ Enable: All on */ | 930 | /* IRQ Enable: Alll on */ |
931 | /* snd_emu1010_fpga_write(emu, 0x09, 0x0f ); */ | ||
930 | /* IRQ Enable: All off */ | 932 | /* IRQ Enable: All off */ |
931 | snd_emu1010_fpga_write(emu, EMU_HANA_IRQ_ENABLE, 0x00 ); | 933 | snd_emu1010_fpga_write(emu, EMU_HANA_IRQ_ENABLE, 0x00); |
932 | 934 | ||
933 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ® ); | 935 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®); |
934 | snd_printk(KERN_INFO "emu1010: Card options3=0x%x\n",reg); | 936 | snd_printk(KERN_INFO "emu1010: Card options3 = 0x%x\n", reg); |
935 | /* Default WCLK set to 48kHz. */ | 937 | /* Default WCLK set to 48kHz. */ |
936 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, 0x00 ); | 938 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, 0x00); |
937 | /* Word Clock source, Internal 48kHz x1 */ | 939 | /* Word Clock source, Internal 48kHz x1 */ |
938 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K ); | 940 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K); |
939 | //snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_4X ); | 941 | /* snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_4X); */ |
940 | /* Audio Dock LEDs. */ | 942 | /* Audio Dock LEDs. */ |
941 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12 ); | 943 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12); |
942 | 944 | ||
943 | #if 0 | 945 | #if 0 |
944 | /* For 96kHz */ | 946 | /* For 96kHz */ |
@@ -992,7 +994,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
992 | * Defaults only, users will set their own values anyways, let's | 994 | * Defaults only, users will set their own values anyways, let's |
993 | * just copy/paste. | 995 | * just copy/paste. |
994 | */ | 996 | */ |
995 | 997 | ||
996 | snd_emu1010_fpga_link_dst_src_write(emu, | 998 | snd_emu1010_fpga_link_dst_src_write(emu, |
997 | EMU_DST_ALICE2_EMU32_8, EMU_SRC_DOCK_MIC_A1); | 999 | EMU_DST_ALICE2_EMU32_8, EMU_SRC_DOCK_MIC_A1); |
998 | snd_emu1010_fpga_link_dst_src_write(emu, | 1000 | snd_emu1010_fpga_link_dst_src_write(emu, |
@@ -1037,19 +1039,19 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
1037 | snd_emu1010_fpga_link_dst_src_write(emu, | 1039 | snd_emu1010_fpga_link_dst_src_write(emu, |
1038 | EMU_DST_ALICE2_EMU32_F, EMU_SRC_HAMOA_ADC_LEFT2); | 1040 | EMU_DST_ALICE2_EMU32_F, EMU_SRC_HAMOA_ADC_LEFT2); |
1039 | #endif | 1041 | #endif |
1040 | for (i = 0;i < 0x20; i++ ) { | 1042 | for (i = 0; i < 0x20; i++) { |
1041 | /* AudioDock Elink <- Silence */ | 1043 | /* AudioDock Elink <- Silence */ |
1042 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0100+i, EMU_SRC_SILENCE); | 1044 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0100 + i, EMU_SRC_SILENCE); |
1043 | } | 1045 | } |
1044 | for (i = 0;i < 4; i++) { | 1046 | for (i = 0; i < 4; i++) { |
1045 | /* Hana SPDIF Out <- Silence */ | 1047 | /* Hana SPDIF Out <- Silence */ |
1046 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0200+i, EMU_SRC_SILENCE); | 1048 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0200 + i, EMU_SRC_SILENCE); |
1047 | } | 1049 | } |
1048 | for (i = 0;i < 7; i++) { | 1050 | for (i = 0; i < 7; i++) { |
1049 | /* Hamoa DAC <- Silence */ | 1051 | /* Hamoa DAC <- Silence */ |
1050 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0300+i, EMU_SRC_SILENCE); | 1052 | snd_emu1010_fpga_link_dst_src_write(emu, 0x0300 + i, EMU_SRC_SILENCE); |
1051 | } | 1053 | } |
1052 | for (i = 0;i < 7; i++) { | 1054 | for (i = 0; i < 7; i++) { |
1053 | /* Hana ADAT Out <- Silence */ | 1055 | /* Hana ADAT Out <- Silence */ |
1054 | snd_emu1010_fpga_link_dst_src_write(emu, EMU_DST_HANA_ADAT + i, EMU_SRC_SILENCE); | 1056 | snd_emu1010_fpga_link_dst_src_write(emu, EMU_DST_HANA_ADAT + i, EMU_SRC_SILENCE); |
1055 | } | 1057 | } |
@@ -1065,30 +1067,30 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
1065 | EMU_DST_ALICE_I2S2_LEFT, EMU_SRC_DOCK_ADC3_LEFT1); | 1067 | EMU_DST_ALICE_I2S2_LEFT, EMU_SRC_DOCK_ADC3_LEFT1); |
1066 | snd_emu1010_fpga_link_dst_src_write(emu, | 1068 | snd_emu1010_fpga_link_dst_src_write(emu, |
1067 | EMU_DST_ALICE_I2S2_RIGHT, EMU_SRC_DOCK_ADC3_RIGHT1); | 1069 | EMU_DST_ALICE_I2S2_RIGHT, EMU_SRC_DOCK_ADC3_RIGHT1); |
1068 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x01 ); // Unmute all | 1070 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x01); /* Unmute all */ |
1071 | |||
1072 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &tmp); | ||
1069 | 1073 | ||
1070 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &tmp ); | ||
1071 | |||
1072 | /* AC97 1.03, Any 32Meg of 2Gig address, Auto-Mute, EMU32 Slave, | 1074 | /* AC97 1.03, Any 32Meg of 2Gig address, Auto-Mute, EMU32 Slave, |
1073 | * Lock Sound Memory Cache, Lock Tank Memory Cache, | 1075 | * Lock Sound Memory Cache, Lock Tank Memory Cache, |
1074 | * Mute all codecs. | 1076 | * Mute all codecs. |
1075 | */ | 1077 | */ |
1076 | outl(0x0000a000, emu->port + HCFG); | 1078 | outl(0x0000a000, emu->port + HCFG); |
1077 | /* AC97 1.03, Any 32Meg of 2Gig address, Auto-Mute, EMU32 Slave, | 1079 | /* AC97 1.03, Any 32Meg of 2Gig address, Auto-Mute, EMU32 Slave, |
1078 | * Lock Sound Memory Cache, Lock Tank Memory Cache, | 1080 | * Lock Sound Memory Cache, Lock Tank Memory Cache, |
1079 | * Un-Mute all codecs. | 1081 | * Un-Mute all codecs. |
1080 | */ | 1082 | */ |
1081 | outl(0x0000a001, emu->port + HCFG); | 1083 | outl(0x0000a001, emu->port + HCFG); |
1082 | 1084 | ||
1083 | /* Initial boot complete. Now patches */ | 1085 | /* Initial boot complete. Now patches */ |
1084 | 1086 | ||
1085 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &tmp ); | 1087 | snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &tmp); |
1086 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19 ); /* MIDI Route */ | 1088 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19); /* MIDI Route */ |
1087 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c ); /* Unknown */ | 1089 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c); /* Unknown */ |
1088 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19 ); /* MIDI Route */ | 1090 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, 0x19); /* MIDI Route */ |
1089 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c ); /* Unknown */ | 1091 | snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, 0x0c); /* Unknown */ |
1090 | snd_emu1010_fpga_read(emu, EMU_HANA_SPDIF_MODE, &tmp ); | 1092 | snd_emu1010_fpga_read(emu, EMU_HANA_SPDIF_MODE, &tmp); |
1091 | snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, 0x10 ); /* SPDIF Format spdif (or 0x11 for aes/ebu) */ | 1093 | snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, 0x10); /* SPDIF Format spdif (or 0x11 for aes/ebu) */ |
1092 | 1094 | ||
1093 | /* Start Micro/Audio Dock firmware loader thread */ | 1095 | /* Start Micro/Audio Dock firmware loader thread */ |
1094 | if (!emu->emu1010.firmware_thread) { | 1096 | if (!emu->emu1010.firmware_thread) { |
@@ -1218,20 +1220,20 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) | |||
1218 | emu->emu1010.output_source[23] = 28; | 1220 | emu->emu1010.output_source[23] = 28; |
1219 | } | 1221 | } |
1220 | /* TEMP: Select SPDIF in/out */ | 1222 | /* TEMP: Select SPDIF in/out */ |
1221 | //snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, 0x0); /* Output spdif */ | 1223 | /* snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, 0x0); */ /* Output spdif */ |
1222 | 1224 | ||
1223 | /* TEMP: Select 48kHz SPDIF out */ | 1225 | /* TEMP: Select 48kHz SPDIF out */ |
1224 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x0); /* Mute all */ | 1226 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x0); /* Mute all */ |
1225 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, 0x0); /* Default fallback clock 48kHz */ | 1227 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, 0x0); /* Default fallback clock 48kHz */ |
1226 | /* Word Clock source, Internal 48kHz x1 */ | 1228 | /* Word Clock source, Internal 48kHz x1 */ |
1227 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K ); | 1229 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K); |
1228 | //snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_4X ); | 1230 | /* snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_4X); */ |
1229 | emu->emu1010.internal_clock = 1; /* 48000 */ | 1231 | emu->emu1010.internal_clock = 1; /* 48000 */ |
1230 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12);/* Set LEDs on Audio Dock */ | 1232 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, 0x12); /* Set LEDs on Audio Dock */ |
1231 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x1); /* Unmute all */ | 1233 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, 0x1); /* Unmute all */ |
1232 | //snd_emu1010_fpga_write(emu, 0x7, 0x0); /* Mute all */ | 1234 | /* snd_emu1010_fpga_write(emu, 0x7, 0x0); */ /* Mute all */ |
1233 | //snd_emu1010_fpga_write(emu, 0x7, 0x1); /* Unmute all */ | 1235 | /* snd_emu1010_fpga_write(emu, 0x7, 0x1); */ /* Unmute all */ |
1234 | //snd_emu1010_fpga_write(emu, 0xe, 0x12); /* Set LEDs on Audio Dock */ | 1236 | /* snd_emu1010_fpga_write(emu, 0xe, 0x12); */ /* Set LEDs on Audio Dock */ |
1235 | 1237 | ||
1236 | return 0; | 1238 | return 0; |
1237 | } | 1239 | } |
@@ -1247,13 +1249,13 @@ static void free_pm_buffer(struct snd_emu10k1 *emu); | |||
1247 | static int snd_emu10k1_free(struct snd_emu10k1 *emu) | 1249 | static int snd_emu10k1_free(struct snd_emu10k1 *emu) |
1248 | { | 1250 | { |
1249 | if (emu->port) { /* avoid access to already used hardware */ | 1251 | if (emu->port) { /* avoid access to already used hardware */ |
1250 | snd_emu10k1_fx8010_tram_setup(emu, 0); | 1252 | snd_emu10k1_fx8010_tram_setup(emu, 0); |
1251 | snd_emu10k1_done(emu); | 1253 | snd_emu10k1_done(emu); |
1252 | snd_emu10k1_free_efx(emu); | 1254 | snd_emu10k1_free_efx(emu); |
1253 | } | 1255 | } |
1254 | if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1010) { | 1256 | if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1010) { |
1255 | /* Disable 48Volt power to Audio Dock */ | 1257 | /* Disable 48Volt power to Audio Dock */ |
1256 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0 ); | 1258 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0); |
1257 | } | 1259 | } |
1258 | if (emu->emu1010.firmware_thread) | 1260 | if (emu->emu1010.firmware_thread) |
1259 | kthread_stop(emu->emu1010.firmware_thread); | 1261 | kthread_stop(emu->emu1010.firmware_thread); |
@@ -1278,7 +1280,7 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) | |||
1278 | #endif | 1280 | #endif |
1279 | if (emu->port) | 1281 | if (emu->port) |
1280 | pci_release_regions(emu->pci); | 1282 | pci_release_regions(emu->pci); |
1281 | if (emu->card_capabilities->ca0151_chip) /* P16V */ | 1283 | if (emu->card_capabilities->ca0151_chip) /* P16V */ |
1282 | snd_p16v_free(emu); | 1284 | snd_p16v_free(emu); |
1283 | pci_disable_device(emu->pci); | 1285 | pci_disable_device(emu->pci); |
1284 | kfree(emu); | 1286 | kfree(emu); |
@@ -1292,21 +1294,6 @@ static int snd_emu10k1_dev_free(struct snd_device *device) | |||
1292 | } | 1294 | } |
1293 | 1295 | ||
1294 | static struct snd_emu_chip_details emu_chip_details[] = { | 1296 | static struct snd_emu_chip_details emu_chip_details[] = { |
1295 | /* Audigy 2 Value AC3 out does not work yet. Need to find out how to turn off interpolators.*/ | ||
1296 | /* Tested by James@superbug.co.uk 3rd July 2005 */ | ||
1297 | /* DSP: CA0108-IAT | ||
1298 | * DAC: CS4382-KQ | ||
1299 | * ADC: Philips 1361T | ||
1300 | * AC97: STAC9750 | ||
1301 | * CA0151: None | ||
1302 | */ | ||
1303 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10011102, | ||
1304 | .driver = "Audigy2", .name = "Audigy 2 Value [SB0400]", | ||
1305 | .id = "Audigy2", | ||
1306 | .emu10k2_chip = 1, | ||
1307 | .ca0108_chip = 1, | ||
1308 | .spk71 = 1, | ||
1309 | .ac97_chip = 1} , | ||
1310 | /* Audigy4 (Not PRO) SB0610 */ | 1297 | /* Audigy4 (Not PRO) SB0610 */ |
1311 | /* Tested by James@superbug.co.uk 4th April 2006 */ | 1298 | /* Tested by James@superbug.co.uk 4th April 2006 */ |
1312 | /* A_IOCFG bits | 1299 | /* A_IOCFG bits |
@@ -1346,20 +1333,37 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1346 | * CA0151: None | 1333 | * CA0151: None |
1347 | */ | 1334 | */ |
1348 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10211102, | 1335 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10211102, |
1349 | .driver = "Audigy2", .name = "Audigy 4 [SB0610]", | 1336 | .driver = "Audigy2", .name = "SB Audigy 4 [SB0610]", |
1350 | .id = "Audigy2", | 1337 | .id = "Audigy2", |
1351 | .emu10k2_chip = 1, | 1338 | .emu10k2_chip = 1, |
1352 | .ca0108_chip = 1, | 1339 | .ca0108_chip = 1, |
1353 | .spk71 = 1, | 1340 | .spk71 = 1, |
1354 | .adc_1361t = 1, /* 24 bit capture instead of 16bit */ | 1341 | .adc_1361t = 1, /* 24 bit capture instead of 16bit */ |
1355 | .ac97_chip = 1} , | 1342 | .ac97_chip = 1} , |
1343 | /* Audigy 2 Value AC3 out does not work yet. | ||
1344 | * Need to find out how to turn off interpolators. | ||
1345 | */ | ||
1346 | /* Tested by James@superbug.co.uk 3rd July 2005 */ | ||
1347 | /* DSP: CA0108-IAT | ||
1348 | * DAC: CS4382-KQ | ||
1349 | * ADC: Philips 1361T | ||
1350 | * AC97: STAC9750 | ||
1351 | * CA0151: None | ||
1352 | */ | ||
1353 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10011102, | ||
1354 | .driver = "Audigy2", .name = "SB Audigy 2 Value [SB0400]", | ||
1355 | .id = "Audigy2", | ||
1356 | .emu10k2_chip = 1, | ||
1357 | .ca0108_chip = 1, | ||
1358 | .spk71 = 1, | ||
1359 | .ac97_chip = 1} , | ||
1356 | /* Audigy 2 ZS Notebook Cardbus card.*/ | 1360 | /* Audigy 2 ZS Notebook Cardbus card.*/ |
1357 | /* Tested by James@superbug.co.uk 6th November 2006 */ | 1361 | /* Tested by James@superbug.co.uk 6th November 2006 */ |
1358 | /* Audio output 7.1/Headphones working. | 1362 | /* Audio output 7.1/Headphones working. |
1359 | * Digital output working. (AC3 not checked, only PCM) | 1363 | * Digital output working. (AC3 not checked, only PCM) |
1360 | * Audio Mic/Line inputs working. | 1364 | * Audio Mic/Line inputs working. |
1361 | * Digital input not tested. | 1365 | * Digital input not tested. |
1362 | */ | 1366 | */ |
1363 | /* DSP: Tina2 | 1367 | /* DSP: Tina2 |
1364 | * DAC: Wolfson WM8768/WM8568 | 1368 | * DAC: Wolfson WM8768/WM8568 |
1365 | * ADC: Wolfson WM8775 | 1369 | * ADC: Wolfson WM8775 |
@@ -1386,7 +1390,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1386 | * | 1390 | * |
1387 | */ | 1391 | */ |
1388 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102, | 1392 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102, |
1389 | .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]", | 1393 | .driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]", |
1390 | .id = "Audigy2", | 1394 | .id = "Audigy2", |
1391 | .emu10k2_chip = 1, | 1395 | .emu10k2_chip = 1, |
1392 | .ca0108_chip = 1, | 1396 | .ca0108_chip = 1, |
@@ -1396,7 +1400,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1396 | .spk71 = 1} , | 1400 | .spk71 = 1} , |
1397 | /* Tested by James@superbug.co.uk 4th Nov 2007. */ | 1401 | /* Tested by James@superbug.co.uk 4th Nov 2007. */ |
1398 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x42011102, | 1402 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x42011102, |
1399 | .driver = "Audigy2", .name = "E-mu 1010 Notebook [MAEM8950]", | 1403 | .driver = "Audigy2", .name = "E-mu 1010 Notebook [MAEM8950]", |
1400 | .id = "EMU1010", | 1404 | .id = "EMU1010", |
1401 | .emu10k2_chip = 1, | 1405 | .emu10k2_chip = 1, |
1402 | .ca0108_chip = 1, | 1406 | .ca0108_chip = 1, |
@@ -1404,47 +1408,49 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1404 | .spk71 = 1 , | 1408 | .spk71 = 1 , |
1405 | .emu_model = EMU_MODEL_EMU1616}, | 1409 | .emu_model = EMU_MODEL_EMU1616}, |
1406 | /* Tested by James@superbug.co.uk 4th Nov 2007. */ | 1410 | /* Tested by James@superbug.co.uk 4th Nov 2007. */ |
1411 | /* This is MAEM8960, 0202 is MAEM 8980 */ | ||
1407 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40041102, | 1412 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40041102, |
1408 | .driver = "Audigy2", .name = "E-mu 1010b PCI [MAEM????]", | 1413 | .driver = "Audigy2", .name = "E-mu 1010b PCI [MAEM8960]", |
1409 | .id = "EMU1010", | 1414 | .id = "EMU1010", |
1410 | .emu10k2_chip = 1, | 1415 | .emu10k2_chip = 1, |
1411 | .ca0108_chip = 1, | 1416 | .ca0108_chip = 1, |
1412 | .spk71 = 1, | 1417 | .spk71 = 1, |
1413 | .emu_model = EMU_MODEL_EMU1010B}, | 1418 | .emu_model = EMU_MODEL_EMU1010B}, /* EMU 1010 new revision */ |
1414 | /* Tested by James@superbug.co.uk 8th July 2005. */ | 1419 | /* Tested by James@superbug.co.uk 8th July 2005. */ |
1420 | /* This is MAEM8810, 0202 is MAEM8820 */ | ||
1415 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102, | 1421 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102, |
1416 | .driver = "Audigy2", .name = "E-mu 1010 [4001]", | 1422 | .driver = "Audigy2", .name = "E-mu 1010 [MAEM8810]", |
1417 | .id = "EMU1010", | 1423 | .id = "EMU1010", |
1418 | .emu10k2_chip = 1, | 1424 | .emu10k2_chip = 1, |
1419 | .ca0102_chip = 1, | 1425 | .ca0102_chip = 1, |
1420 | .spk71 = 1, | 1426 | .spk71 = 1, |
1421 | .emu_model = EMU_MODEL_EMU1010}, /* Emu 1010 */ | 1427 | .emu_model = EMU_MODEL_EMU1010}, /* EMU 1010 old revision */ |
1422 | /* EMU0404b */ | 1428 | /* EMU0404b */ |
1423 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40021102, | 1429 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40021102, |
1424 | .driver = "Audigy2", .name = "E-mu 0404b [4002]", | 1430 | .driver = "Audigy2", .name = "E-mu 0404b PCI [MAEM8852]", |
1425 | .id = "EMU0404", | 1431 | .id = "EMU0404", |
1426 | .emu10k2_chip = 1, | 1432 | .emu10k2_chip = 1, |
1427 | .ca0108_chip = 1, | 1433 | .ca0108_chip = 1, |
1428 | .spk71 = 1, | 1434 | .spk71 = 1, |
1429 | .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 */ | 1435 | .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 new revision */ |
1430 | /* Tested by James@superbug.co.uk 20-3-2007. */ | 1436 | /* Tested by James@superbug.co.uk 20-3-2007. */ |
1431 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40021102, | 1437 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40021102, |
1432 | .driver = "Audigy2", .name = "E-mu 0404 [4002]", | 1438 | .driver = "Audigy2", .name = "E-mu 0404 [MAEM8850]", |
1433 | .id = "EMU0404", | 1439 | .id = "EMU0404", |
1434 | .emu10k2_chip = 1, | 1440 | .emu10k2_chip = 1, |
1435 | .ca0102_chip = 1, | 1441 | .ca0102_chip = 1, |
1436 | .spk71 = 1, | 1442 | .spk71 = 1, |
1437 | .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 */ | 1443 | .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 */ |
1438 | /* Audigy4 (Not PRO) SB0610 */ | 1444 | /* Note that all E-mu cards require kernel 2.6 or newer. */ |
1439 | {.vendor = 0x1102, .device = 0x0008, | 1445 | {.vendor = 0x1102, .device = 0x0008, |
1440 | .driver = "Audigy2", .name = "Audigy 2 Value [Unknown]", | 1446 | .driver = "Audigy2", .name = "SB Audigy 2 Value [Unknown]", |
1441 | .id = "Audigy2", | 1447 | .id = "Audigy2", |
1442 | .emu10k2_chip = 1, | 1448 | .emu10k2_chip = 1, |
1443 | .ca0108_chip = 1, | 1449 | .ca0108_chip = 1, |
1444 | .ac97_chip = 1} , | 1450 | .ac97_chip = 1} , |
1445 | /* Tested by James@superbug.co.uk 3rd July 2005 */ | 1451 | /* Tested by James@superbug.co.uk 3rd July 2005 */ |
1446 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20071102, | 1452 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20071102, |
1447 | .driver = "Audigy2", .name = "Audigy 4 PRO [SB0380]", | 1453 | .driver = "Audigy2", .name = "SB Audigy 4 PRO [SB0380]", |
1448 | .id = "Audigy2", | 1454 | .id = "Audigy2", |
1449 | .emu10k2_chip = 1, | 1455 | .emu10k2_chip = 1, |
1450 | .ca0102_chip = 1, | 1456 | .ca0102_chip = 1, |
@@ -1457,7 +1463,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1457 | * Just like 0x20021102 | 1463 | * Just like 0x20021102 |
1458 | */ | 1464 | */ |
1459 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20061102, | 1465 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20061102, |
1460 | .driver = "Audigy2", .name = "Audigy 2 [SB0350b]", | 1466 | .driver = "Audigy2", .name = "SB Audigy 2 [SB0350b]", |
1461 | .id = "Audigy2", | 1467 | .id = "Audigy2", |
1462 | .emu10k2_chip = 1, | 1468 | .emu10k2_chip = 1, |
1463 | .ca0102_chip = 1, | 1469 | .ca0102_chip = 1, |
@@ -1467,7 +1473,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1467 | .invert_shared_spdif = 1, /* digital/analog switch swapped */ | 1473 | .invert_shared_spdif = 1, /* digital/analog switch swapped */ |
1468 | .ac97_chip = 1} , | 1474 | .ac97_chip = 1} , |
1469 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102, | 1475 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102, |
1470 | .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", | 1476 | .driver = "Audigy2", .name = "SB Audigy 2 ZS [SB0350]", |
1471 | .id = "Audigy2", | 1477 | .id = "Audigy2", |
1472 | .emu10k2_chip = 1, | 1478 | .emu10k2_chip = 1, |
1473 | .ca0102_chip = 1, | 1479 | .ca0102_chip = 1, |
@@ -1477,7 +1483,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1477 | .invert_shared_spdif = 1, /* digital/analog switch swapped */ | 1483 | .invert_shared_spdif = 1, /* digital/analog switch swapped */ |
1478 | .ac97_chip = 1} , | 1484 | .ac97_chip = 1} , |
1479 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102, | 1485 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102, |
1480 | .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", | 1486 | .driver = "Audigy2", .name = "SB Audigy 2 ZS [SB0360]", |
1481 | .id = "Audigy2", | 1487 | .id = "Audigy2", |
1482 | .emu10k2_chip = 1, | 1488 | .emu10k2_chip = 1, |
1483 | .ca0102_chip = 1, | 1489 | .ca0102_chip = 1, |
@@ -1495,7 +1501,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1495 | * CA0151: Yes | 1501 | * CA0151: Yes |
1496 | */ | 1502 | */ |
1497 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10071102, | 1503 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10071102, |
1498 | .driver = "Audigy2", .name = "Audigy 2 [SB0240]", | 1504 | .driver = "Audigy2", .name = "SB Audigy 2 [SB0240]", |
1499 | .id = "Audigy2", | 1505 | .id = "Audigy2", |
1500 | .emu10k2_chip = 1, | 1506 | .emu10k2_chip = 1, |
1501 | .ca0102_chip = 1, | 1507 | .ca0102_chip = 1, |
@@ -1505,7 +1511,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1505 | .adc_1361t = 1, /* 24 bit capture instead of 16bit */ | 1511 | .adc_1361t = 1, /* 24 bit capture instead of 16bit */ |
1506 | .ac97_chip = 1} , | 1512 | .ac97_chip = 1} , |
1507 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102, | 1513 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102, |
1508 | .driver = "Audigy2", .name = "Audigy 2 EX [1005]", | 1514 | .driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]", |
1509 | .id = "Audigy2", | 1515 | .id = "Audigy2", |
1510 | .emu10k2_chip = 1, | 1516 | .emu10k2_chip = 1, |
1511 | .ca0102_chip = 1, | 1517 | .ca0102_chip = 1, |
@@ -1515,7 +1521,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1515 | /* Dell OEM/Creative Labs Audigy 2 ZS */ | 1521 | /* Dell OEM/Creative Labs Audigy 2 ZS */ |
1516 | /* See ALSA bug#1365 */ | 1522 | /* See ALSA bug#1365 */ |
1517 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10031102, | 1523 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10031102, |
1518 | .driver = "Audigy2", .name = "Audigy 2 ZS [SB0353]", | 1524 | .driver = "Audigy2", .name = "SB Audigy 2 ZS [SB0353]", |
1519 | .id = "Audigy2", | 1525 | .id = "Audigy2", |
1520 | .emu10k2_chip = 1, | 1526 | .emu10k2_chip = 1, |
1521 | .ca0102_chip = 1, | 1527 | .ca0102_chip = 1, |
@@ -1524,7 +1530,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1524 | .spdif_bug = 1, | 1530 | .spdif_bug = 1, |
1525 | .ac97_chip = 1} , | 1531 | .ac97_chip = 1} , |
1526 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, | 1532 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, |
1527 | .driver = "Audigy2", .name = "Audigy 2 Platinum [SB0240P]", | 1533 | .driver = "Audigy2", .name = "SB Audigy 2 Platinum [SB0240P]", |
1528 | .id = "Audigy2", | 1534 | .id = "Audigy2", |
1529 | .emu10k2_chip = 1, | 1535 | .emu10k2_chip = 1, |
1530 | .ca0102_chip = 1, | 1536 | .ca0102_chip = 1, |
@@ -1535,7 +1541,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1535 | .adc_1361t = 1, /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */ | 1541 | .adc_1361t = 1, /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */ |
1536 | .ac97_chip = 1} , | 1542 | .ac97_chip = 1} , |
1537 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, | 1543 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, |
1538 | .driver = "Audigy2", .name = "Audigy 2 [Unknown]", | 1544 | .driver = "Audigy2", .name = "SB Audigy 2 [Unknown]", |
1539 | .id = "Audigy2", | 1545 | .id = "Audigy2", |
1540 | .emu10k2_chip = 1, | 1546 | .emu10k2_chip = 1, |
1541 | .ca0102_chip = 1, | 1547 | .ca0102_chip = 1, |
@@ -1543,78 +1549,79 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1543 | .spdif_bug = 1, | 1549 | .spdif_bug = 1, |
1544 | .ac97_chip = 1} , | 1550 | .ac97_chip = 1} , |
1545 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00531102, | 1551 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00531102, |
1546 | .driver = "Audigy", .name = "Audigy 1 [SB0090]", | 1552 | .driver = "Audigy", .name = "SB Audigy 1 [SB0092]", |
1547 | .id = "Audigy", | 1553 | .id = "Audigy", |
1548 | .emu10k2_chip = 1, | 1554 | .emu10k2_chip = 1, |
1549 | .ca0102_chip = 1, | 1555 | .ca0102_chip = 1, |
1550 | .ac97_chip = 1} , | 1556 | .ac97_chip = 1} , |
1551 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00521102, | 1557 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00521102, |
1552 | .driver = "Audigy", .name = "Audigy 1 ES [SB0160]", | 1558 | .driver = "Audigy", .name = "SB Audigy 1 ES [SB0160]", |
1553 | .id = "Audigy", | 1559 | .id = "Audigy", |
1554 | .emu10k2_chip = 1, | 1560 | .emu10k2_chip = 1, |
1555 | .ca0102_chip = 1, | 1561 | .ca0102_chip = 1, |
1556 | .spdif_bug = 1, | 1562 | .spdif_bug = 1, |
1557 | .ac97_chip = 1} , | 1563 | .ac97_chip = 1} , |
1558 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00511102, | 1564 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00511102, |
1559 | .driver = "Audigy", .name = "Audigy 1 [SB0090]", | 1565 | .driver = "Audigy", .name = "SB Audigy 1 [SB0090]", |
1560 | .id = "Audigy", | 1566 | .id = "Audigy", |
1561 | .emu10k2_chip = 1, | 1567 | .emu10k2_chip = 1, |
1562 | .ca0102_chip = 1, | 1568 | .ca0102_chip = 1, |
1563 | .ac97_chip = 1} , | 1569 | .ac97_chip = 1} , |
1564 | {.vendor = 0x1102, .device = 0x0004, | 1570 | {.vendor = 0x1102, .device = 0x0004, |
1565 | .driver = "Audigy", .name = "Audigy 1 [Unknown]", | 1571 | .driver = "Audigy", .name = "Audigy 1 [Unknown]", |
1566 | .id = "Audigy", | 1572 | .id = "Audigy", |
1567 | .emu10k2_chip = 1, | 1573 | .emu10k2_chip = 1, |
1568 | .ca0102_chip = 1, | 1574 | .ca0102_chip = 1, |
1569 | .ac97_chip = 1} , | 1575 | .ac97_chip = 1} , |
1570 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806B1102, | 1576 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x100a1102, |
1571 | .driver = "EMU10K1", .name = "SBLive! [SB0105]", | 1577 | .driver = "EMU10K1", .name = "SB Live! 5.1 [SB0220]", |
1578 | .id = "Live", | ||
1579 | .emu10k1_chip = 1, | ||
1580 | .ac97_chip = 1, | ||
1581 | .sblive51 = 1} , | ||
1582 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806b1102, | ||
1583 | .driver = "EMU10K1", .name = "SB Live! [SB0105]", | ||
1572 | .id = "Live", | 1584 | .id = "Live", |
1573 | .emu10k1_chip = 1, | 1585 | .emu10k1_chip = 1, |
1574 | .ac97_chip = 1, | 1586 | .ac97_chip = 1, |
1575 | .sblive51 = 1} , | 1587 | .sblive51 = 1} , |
1576 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806A1102, | 1588 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806a1102, |
1577 | .driver = "EMU10K1", .name = "SBLive! Value [SB0103]", | 1589 | .driver = "EMU10K1", .name = "SB Live! Value [SB0103]", |
1578 | .id = "Live", | 1590 | .id = "Live", |
1579 | .emu10k1_chip = 1, | 1591 | .emu10k1_chip = 1, |
1580 | .ac97_chip = 1, | 1592 | .ac97_chip = 1, |
1581 | .sblive51 = 1} , | 1593 | .sblive51 = 1} , |
1582 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80691102, | 1594 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80691102, |
1583 | .driver = "EMU10K1", .name = "SBLive! Value [SB0101]", | 1595 | .driver = "EMU10K1", .name = "SB Live! Value [SB0101]", |
1584 | .id = "Live", | 1596 | .id = "Live", |
1585 | .emu10k1_chip = 1, | 1597 | .emu10k1_chip = 1, |
1586 | .ac97_chip = 1, | 1598 | .ac97_chip = 1, |
1587 | .sblive51 = 1} , | 1599 | .sblive51 = 1} , |
1588 | /* Tested by ALSA bug#1680 26th December 2005 */ | 1600 | /* Tested by ALSA bug#1680 26th December 2005 */ |
1589 | /* note: It really has SB0220 written on the card. */ | 1601 | /* note: It really has SB0220 written on the card, */ |
1602 | /* but it's SB0228 according to kx.inf */ | ||
1590 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80661102, | 1603 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80661102, |
1591 | .driver = "EMU10K1", .name = "SB Live 5.1 Dell OEM [SB0220]", | 1604 | .driver = "EMU10K1", .name = "SB Live! 5.1 Dell OEM [SB0228]", |
1592 | .id = "Live", | 1605 | .id = "Live", |
1593 | .emu10k1_chip = 1, | 1606 | .emu10k1_chip = 1, |
1594 | .ac97_chip = 1, | 1607 | .ac97_chip = 1, |
1595 | .sblive51 = 1} , | 1608 | .sblive51 = 1} , |
1596 | /* Tested by Thomas Zehetbauer 27th Aug 2005 */ | 1609 | /* Tested by Thomas Zehetbauer 27th Aug 2005 */ |
1597 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80651102, | 1610 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80651102, |
1598 | .driver = "EMU10K1", .name = "SB Live 5.1 [SB0220]", | 1611 | .driver = "EMU10K1", .name = "SB Live! 5.1 [SB0220]", |
1599 | .id = "Live", | ||
1600 | .emu10k1_chip = 1, | ||
1601 | .ac97_chip = 1, | ||
1602 | .sblive51 = 1} , | ||
1603 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x100a1102, | ||
1604 | .driver = "EMU10K1", .name = "SB Live 5.1 [SB0220]", | ||
1605 | .id = "Live", | 1612 | .id = "Live", |
1606 | .emu10k1_chip = 1, | 1613 | .emu10k1_chip = 1, |
1607 | .ac97_chip = 1, | 1614 | .ac97_chip = 1, |
1608 | .sblive51 = 1} , | 1615 | .sblive51 = 1} , |
1609 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80641102, | 1616 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80641102, |
1610 | .driver = "EMU10K1", .name = "SB Live 5.1", | 1617 | .driver = "EMU10K1", .name = "SB Live! 5.1", |
1611 | .id = "Live", | 1618 | .id = "Live", |
1612 | .emu10k1_chip = 1, | 1619 | .emu10k1_chip = 1, |
1613 | .ac97_chip = 1, | 1620 | .ac97_chip = 1, |
1614 | .sblive51 = 1} , | 1621 | .sblive51 = 1} , |
1615 | /* Tested by alsa bugtrack user "hus" bug #1297 12th Aug 2005 */ | 1622 | /* Tested by alsa bugtrack user "hus" bug #1297 12th Aug 2005 */ |
1616 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80611102, | 1623 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80611102, |
1617 | .driver = "EMU10K1", .name = "SBLive 5.1 [SB0060]", | 1624 | .driver = "EMU10K1", .name = "SB Live! 5.1 [SB0060]", |
1618 | .id = "Live", | 1625 | .id = "Live", |
1619 | .emu10k1_chip = 1, | 1626 | .emu10k1_chip = 1, |
1620 | .ac97_chip = 2, /* ac97 is optional; both SBLive 5.1 and platinum | 1627 | .ac97_chip = 2, /* ac97 is optional; both SBLive 5.1 and platinum |
@@ -1622,78 +1629,78 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1622 | */ | 1629 | */ |
1623 | .sblive51 = 1} , | 1630 | .sblive51 = 1} , |
1624 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80511102, | 1631 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80511102, |
1625 | .driver = "EMU10K1", .name = "SBLive! Value [CT4850]", | 1632 | .driver = "EMU10K1", .name = "SB Live! Value [CT4850]", |
1626 | .id = "Live", | 1633 | .id = "Live", |
1627 | .emu10k1_chip = 1, | 1634 | .emu10k1_chip = 1, |
1628 | .ac97_chip = 1, | 1635 | .ac97_chip = 1, |
1629 | .sblive51 = 1} , | 1636 | .sblive51 = 1} , |
1630 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80401102, | 1637 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80401102, |
1631 | .driver = "EMU10K1", .name = "SBLive! Platinum [CT4760P]", | 1638 | .driver = "EMU10K1", .name = "SB Live! Platinum [CT4760P]", |
1632 | .id = "Live", | 1639 | .id = "Live", |
1633 | .emu10k1_chip = 1, | 1640 | .emu10k1_chip = 1, |
1634 | .ac97_chip = 1} , | 1641 | .ac97_chip = 1} , |
1635 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80321102, | 1642 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80321102, |
1636 | .driver = "EMU10K1", .name = "SBLive! Value [CT4871]", | 1643 | .driver = "EMU10K1", .name = "SB Live! Value [CT4871]", |
1637 | .id = "Live", | 1644 | .id = "Live", |
1638 | .emu10k1_chip = 1, | 1645 | .emu10k1_chip = 1, |
1639 | .ac97_chip = 1, | 1646 | .ac97_chip = 1, |
1640 | .sblive51 = 1} , | 1647 | .sblive51 = 1} , |
1641 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80311102, | 1648 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80311102, |
1642 | .driver = "EMU10K1", .name = "SBLive! Value [CT4831]", | 1649 | .driver = "EMU10K1", .name = "SB Live! Value [CT4831]", |
1643 | .id = "Live", | 1650 | .id = "Live", |
1644 | .emu10k1_chip = 1, | 1651 | .emu10k1_chip = 1, |
1645 | .ac97_chip = 1, | 1652 | .ac97_chip = 1, |
1646 | .sblive51 = 1} , | 1653 | .sblive51 = 1} , |
1647 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80281102, | 1654 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80281102, |
1648 | .driver = "EMU10K1", .name = "SBLive! Value [CT4870]", | 1655 | .driver = "EMU10K1", .name = "SB Live! Value [CT4870]", |
1649 | .id = "Live", | 1656 | .id = "Live", |
1650 | .emu10k1_chip = 1, | 1657 | .emu10k1_chip = 1, |
1651 | .ac97_chip = 1, | 1658 | .ac97_chip = 1, |
1652 | .sblive51 = 1} , | 1659 | .sblive51 = 1} , |
1653 | /* Tested by James@superbug.co.uk 3rd July 2005 */ | 1660 | /* Tested by James@superbug.co.uk 3rd July 2005 */ |
1654 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80271102, | 1661 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80271102, |
1655 | .driver = "EMU10K1", .name = "SBLive! Value [CT4832]", | 1662 | .driver = "EMU10K1", .name = "SB Live! Value [CT4832]", |
1656 | .id = "Live", | 1663 | .id = "Live", |
1657 | .emu10k1_chip = 1, | 1664 | .emu10k1_chip = 1, |
1658 | .ac97_chip = 1, | 1665 | .ac97_chip = 1, |
1659 | .sblive51 = 1} , | 1666 | .sblive51 = 1} , |
1660 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80261102, | 1667 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80261102, |
1661 | .driver = "EMU10K1", .name = "SBLive! Value [CT4830]", | 1668 | .driver = "EMU10K1", .name = "SB Live! Value [CT4830]", |
1662 | .id = "Live", | 1669 | .id = "Live", |
1663 | .emu10k1_chip = 1, | 1670 | .emu10k1_chip = 1, |
1664 | .ac97_chip = 1, | 1671 | .ac97_chip = 1, |
1665 | .sblive51 = 1} , | 1672 | .sblive51 = 1} , |
1666 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80231102, | 1673 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80231102, |
1667 | .driver = "EMU10K1", .name = "SB PCI512 [CT4790]", | 1674 | .driver = "EMU10K1", .name = "SB PCI512 [CT4790]", |
1668 | .id = "Live", | 1675 | .id = "Live", |
1669 | .emu10k1_chip = 1, | 1676 | .emu10k1_chip = 1, |
1670 | .ac97_chip = 1, | 1677 | .ac97_chip = 1, |
1671 | .sblive51 = 1} , | 1678 | .sblive51 = 1} , |
1672 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80221102, | 1679 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80221102, |
1673 | .driver = "EMU10K1", .name = "SBLive! Value [CT4780]", | 1680 | .driver = "EMU10K1", .name = "SB Live! Value [CT4780]", |
1674 | .id = "Live", | 1681 | .id = "Live", |
1675 | .emu10k1_chip = 1, | 1682 | .emu10k1_chip = 1, |
1676 | .ac97_chip = 1, | 1683 | .ac97_chip = 1, |
1677 | .sblive51 = 1} , | 1684 | .sblive51 = 1} , |
1678 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x40011102, | 1685 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x40011102, |
1679 | .driver = "EMU10K1", .name = "E-mu APS [4001]", | 1686 | .driver = "EMU10K1", .name = "E-mu APS [PC545]", |
1680 | .id = "APS", | 1687 | .id = "APS", |
1681 | .emu10k1_chip = 1, | 1688 | .emu10k1_chip = 1, |
1682 | .ecard = 1} , | 1689 | .ecard = 1} , |
1683 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00211102, | 1690 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00211102, |
1684 | .driver = "EMU10K1", .name = "SBLive! [CT4620]", | 1691 | .driver = "EMU10K1", .name = "SB Live! [CT4620]", |
1685 | .id = "Live", | 1692 | .id = "Live", |
1686 | .emu10k1_chip = 1, | 1693 | .emu10k1_chip = 1, |
1687 | .ac97_chip = 1, | 1694 | .ac97_chip = 1, |
1688 | .sblive51 = 1} , | 1695 | .sblive51 = 1} , |
1689 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00201102, | 1696 | {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00201102, |
1690 | .driver = "EMU10K1", .name = "SBLive! Value [CT4670]", | 1697 | .driver = "EMU10K1", .name = "SB Live! Value [CT4670]", |
1691 | .id = "Live", | 1698 | .id = "Live", |
1692 | .emu10k1_chip = 1, | 1699 | .emu10k1_chip = 1, |
1693 | .ac97_chip = 1, | 1700 | .ac97_chip = 1, |
1694 | .sblive51 = 1} , | 1701 | .sblive51 = 1} , |
1695 | {.vendor = 0x1102, .device = 0x0002, | 1702 | {.vendor = 0x1102, .device = 0x0002, |
1696 | .driver = "EMU10K1", .name = "SB Live [Unknown]", | 1703 | .driver = "EMU10K1", .name = "SB Live! [Unknown]", |
1697 | .id = "Live", | 1704 | .id = "Live", |
1698 | .emu10k1_chip = 1, | 1705 | .emu10k1_chip = 1, |
1699 | .ac97_chip = 1, | 1706 | .ac97_chip = 1, |
@@ -1702,13 +1709,13 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
1702 | }; | 1709 | }; |
1703 | 1710 | ||
1704 | int __devinit snd_emu10k1_create(struct snd_card *card, | 1711 | int __devinit snd_emu10k1_create(struct snd_card *card, |
1705 | struct pci_dev * pci, | 1712 | struct pci_dev *pci, |
1706 | unsigned short extin_mask, | 1713 | unsigned short extin_mask, |
1707 | unsigned short extout_mask, | 1714 | unsigned short extout_mask, |
1708 | long max_cache_bytes, | 1715 | long max_cache_bytes, |
1709 | int enable_ir, | 1716 | int enable_ir, |
1710 | uint subsystem, | 1717 | uint subsystem, |
1711 | struct snd_emu10k1 ** remu) | 1718 | struct snd_emu10k1 **remu) |
1712 | { | 1719 | { |
1713 | struct snd_emu10k1 *emu; | 1720 | struct snd_emu10k1 *emu; |
1714 | int idx, err; | 1721 | int idx, err; |
@@ -1718,11 +1725,12 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1718 | static struct snd_device_ops ops = { | 1725 | static struct snd_device_ops ops = { |
1719 | .dev_free = snd_emu10k1_dev_free, | 1726 | .dev_free = snd_emu10k1_dev_free, |
1720 | }; | 1727 | }; |
1721 | 1728 | ||
1722 | *remu = NULL; | 1729 | *remu = NULL; |
1723 | 1730 | ||
1724 | /* enable PCI device */ | 1731 | /* enable PCI device */ |
1725 | if ((err = pci_enable_device(pci)) < 0) | 1732 | err = pci_enable_device(pci); |
1733 | if (err < 0) | ||
1726 | return err; | 1734 | return err; |
1727 | 1735 | ||
1728 | emu = kzalloc(sizeof(*emu), GFP_KERNEL); | 1736 | emu = kzalloc(sizeof(*emu), GFP_KERNEL); |
@@ -1749,16 +1757,17 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1749 | emu->revision = pci->revision; | 1757 | emu->revision = pci->revision; |
1750 | pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &emu->serial); | 1758 | pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &emu->serial); |
1751 | pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &emu->model); | 1759 | pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &emu->model); |
1752 | snd_printdd("vendor=0x%x, device=0x%x, subsystem_vendor_id=0x%x, subsystem_id=0x%x\n",pci->vendor, pci->device, emu->serial, emu->model); | 1760 | snd_printdd("vendor = 0x%x, device = 0x%x, subsystem_vendor_id = 0x%x, subsystem_id = 0x%x\n", pci->vendor, pci->device, emu->serial, emu->model); |
1753 | 1761 | ||
1754 | for (c = emu_chip_details; c->vendor; c++) { | 1762 | for (c = emu_chip_details; c->vendor; c++) { |
1755 | if (c->vendor == pci->vendor && c->device == pci->device) { | 1763 | if (c->vendor == pci->vendor && c->device == pci->device) { |
1756 | if (subsystem) { | 1764 | if (subsystem) { |
1757 | if (c->subsystem && (c->subsystem == subsystem) ) { | 1765 | if (c->subsystem && (c->subsystem == subsystem)) |
1758 | break; | 1766 | break; |
1759 | } else continue; | 1767 | else |
1768 | continue; | ||
1760 | } else { | 1769 | } else { |
1761 | if (c->subsystem && (c->subsystem != emu->serial) ) | 1770 | if (c->subsystem && (c->subsystem != emu->serial)) |
1762 | continue; | 1771 | continue; |
1763 | if (c->revision && c->revision != emu->revision) | 1772 | if (c->revision && c->revision != emu->revision) |
1764 | continue; | 1773 | continue; |
@@ -1774,14 +1783,18 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1774 | } | 1783 | } |
1775 | emu->card_capabilities = c; | 1784 | emu->card_capabilities = c; |
1776 | if (c->subsystem && !subsystem) | 1785 | if (c->subsystem && !subsystem) |
1777 | snd_printdd("Sound card name=%s\n", c->name); | 1786 | snd_printdd("Sound card name = %s\n", c->name); |
1778 | else if (subsystem) | 1787 | else if (subsystem) |
1779 | snd_printdd("Sound card name=%s, vendor=0x%x, device=0x%x, subsystem=0x%x. Forced to subsytem=0x%x\n", | 1788 | snd_printdd("Sound card name = %s, " |
1780 | c->name, pci->vendor, pci->device, emu->serial, c->subsystem); | 1789 | "vendor = 0x%x, device = 0x%x, subsystem = 0x%x. " |
1781 | else | 1790 | "Forced to subsytem = 0x%x\n", c->name, |
1782 | snd_printdd("Sound card name=%s, vendor=0x%x, device=0x%x, subsystem=0x%x.\n", | 1791 | pci->vendor, pci->device, emu->serial, c->subsystem); |
1783 | c->name, pci->vendor, pci->device, emu->serial); | 1792 | else |
1784 | 1793 | snd_printdd("Sound card name = %s, " | |
1794 | "vendor = 0x%x, device = 0x%x, subsystem = 0x%x.\n", | ||
1795 | c->name, pci->vendor, pci->device, | ||
1796 | emu->serial); | ||
1797 | |||
1785 | if (!*card->id && c->id) { | 1798 | if (!*card->id && c->id) { |
1786 | int i, n = 0; | 1799 | int i, n = 0; |
1787 | strlcpy(card->id, c->id, sizeof(card->id)); | 1800 | strlcpy(card->id, c->id, sizeof(card->id)); |
@@ -1815,7 +1828,8 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1815 | else | 1828 | else |
1816 | emu->gpr_base = FXGPREGBASE; | 1829 | emu->gpr_base = FXGPREGBASE; |
1817 | 1830 | ||
1818 | if ((err = pci_request_regions(pci, "EMU10K1")) < 0) { | 1831 | err = pci_request_regions(pci, "EMU10K1"); |
1832 | if (err < 0) { | ||
1819 | kfree(emu); | 1833 | kfree(emu); |
1820 | pci_disable_device(pci); | 1834 | pci_disable_device(pci); |
1821 | return err; | 1835 | return err; |
@@ -1862,21 +1876,25 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1862 | emu->enable_ir = enable_ir; | 1876 | emu->enable_ir = enable_ir; |
1863 | 1877 | ||
1864 | if (emu->card_capabilities->ca_cardbus_chip) { | 1878 | if (emu->card_capabilities->ca_cardbus_chip) { |
1865 | if ((err = snd_emu10k1_cardbus_init(emu)) < 0) | 1879 | err = snd_emu10k1_cardbus_init(emu); |
1880 | if (err < 0) | ||
1866 | goto error; | 1881 | goto error; |
1867 | } | 1882 | } |
1868 | if (emu->card_capabilities->ecard) { | 1883 | if (emu->card_capabilities->ecard) { |
1869 | if ((err = snd_emu10k1_ecard_init(emu)) < 0) | 1884 | err = snd_emu10k1_ecard_init(emu); |
1885 | if (err < 0) | ||
1870 | goto error; | 1886 | goto error; |
1871 | } else if (emu->card_capabilities->emu_model) { | 1887 | } else if (emu->card_capabilities->emu_model) { |
1872 | if ((err = snd_emu10k1_emu1010_init(emu)) < 0) { | 1888 | err = snd_emu10k1_emu1010_init(emu); |
1873 | snd_emu10k1_free(emu); | 1889 | if (err < 0) { |
1874 | return err; | 1890 | snd_emu10k1_free(emu); |
1875 | } | 1891 | return err; |
1892 | } | ||
1876 | } else { | 1893 | } else { |
1877 | /* 5.1: Enable the additional AC97 Slots. If the emu10k1 version | 1894 | /* 5.1: Enable the additional AC97 Slots. If the emu10k1 version |
1878 | does not support this, it shouldn't do any harm */ | 1895 | does not support this, it shouldn't do any harm */ |
1879 | snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); | 1896 | snd_emu10k1_ptr_write(emu, AC97SLOT, 0, |
1897 | AC97SLOT_CNTR|AC97SLOT_LFE); | ||
1880 | } | 1898 | } |
1881 | 1899 | ||
1882 | /* initialize TRAM setup */ | 1900 | /* initialize TRAM setup */ |
@@ -1916,7 +1934,7 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1916 | snd_emu10k1_synth_alloc(emu, 4096); | 1934 | snd_emu10k1_synth_alloc(emu, 4096); |
1917 | if (emu->reserved_page) | 1935 | if (emu->reserved_page) |
1918 | emu->reserved_page->map_locked = 1; | 1936 | emu->reserved_page->map_locked = 1; |
1919 | 1937 | ||
1920 | /* Clear silent pages and set up pointers */ | 1938 | /* Clear silent pages and set up pointers */ |
1921 | memset(emu->silent_page.area, 0, PAGE_SIZE); | 1939 | memset(emu->silent_page.area, 0, PAGE_SIZE); |
1922 | silent_page = emu->silent_page.addr << 1; | 1940 | silent_page = emu->silent_page.addr << 1; |
@@ -1929,19 +1947,23 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1929 | emu->voices[idx].number = idx; | 1947 | emu->voices[idx].number = idx; |
1930 | } | 1948 | } |
1931 | 1949 | ||
1932 | if ((err = snd_emu10k1_init(emu, enable_ir, 0)) < 0) | 1950 | err = snd_emu10k1_init(emu, enable_ir, 0); |
1951 | if (err < 0) | ||
1933 | goto error; | 1952 | goto error; |
1934 | #ifdef CONFIG_PM | 1953 | #ifdef CONFIG_PM |
1935 | if ((err = alloc_pm_buffer(emu)) < 0) | 1954 | err = alloc_pm_buffer(emu); |
1955 | if (err < 0) | ||
1936 | goto error; | 1956 | goto error; |
1937 | #endif | 1957 | #endif |
1938 | 1958 | ||
1939 | /* Initialize the effect engine */ | 1959 | /* Initialize the effect engine */ |
1940 | if ((err = snd_emu10k1_init_efx(emu)) < 0) | 1960 | err = snd_emu10k1_init_efx(emu); |
1961 | if (err < 0) | ||
1941 | goto error; | 1962 | goto error; |
1942 | snd_emu10k1_audio_enable(emu); | 1963 | snd_emu10k1_audio_enable(emu); |
1943 | 1964 | ||
1944 | if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, emu, &ops)) < 0) | 1965 | err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, emu, &ops); |
1966 | if (err < 0) | ||
1945 | goto error; | 1967 | goto error; |
1946 | 1968 | ||
1947 | #ifdef CONFIG_PROC_FS | 1969 | #ifdef CONFIG_PROC_FS |
@@ -1981,7 +2003,7 @@ static int __devinit alloc_pm_buffer(struct snd_emu10k1 *emu) | |||
1981 | if (emu->audigy) | 2003 | if (emu->audigy) |
1982 | size += ARRAY_SIZE(saved_regs_audigy); | 2004 | size += ARRAY_SIZE(saved_regs_audigy); |
1983 | emu->saved_ptr = vmalloc(4 * NUM_G * size); | 2005 | emu->saved_ptr = vmalloc(4 * NUM_G * size); |
1984 | if (! emu->saved_ptr) | 2006 | if (!emu->saved_ptr) |
1985 | return -ENOMEM; | 2007 | return -ENOMEM; |
1986 | if (snd_emu10k1_efx_alloc_pm_buffer(emu) < 0) | 2008 | if (snd_emu10k1_efx_alloc_pm_buffer(emu) < 0) |
1987 | return -ENOMEM; | 2009 | return -ENOMEM; |
@@ -2026,7 +2048,7 @@ void snd_emu10k1_resume_init(struct snd_emu10k1 *emu) | |||
2026 | if (emu->card_capabilities->ecard) | 2048 | if (emu->card_capabilities->ecard) |
2027 | snd_emu10k1_ecard_init(emu); | 2049 | snd_emu10k1_ecard_init(emu); |
2028 | else if (emu->card_capabilities->emu_model) | 2050 | else if (emu->card_capabilities->emu_model) |
2029 | snd_emu10k1_emu1010_init(emu); | 2051 | snd_emu10k1_emu1010_init(emu); |
2030 | else | 2052 | else |
2031 | snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); | 2053 | snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); |
2032 | snd_emu10k1_init(emu, emu->enable_ir, 1); | 2054 | snd_emu10k1_init(emu, emu->enable_ir, 1); |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 9b77b3e0fa98..3ecd7e797dee 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
@@ -37,6 +37,9 @@ static void snd_hda_generate_beep(struct work_struct *work) | |||
37 | container_of(work, struct hda_beep, beep_work); | 37 | container_of(work, struct hda_beep, beep_work); |
38 | struct hda_codec *codec = beep->codec; | 38 | struct hda_codec *codec = beep->codec; |
39 | 39 | ||
40 | if (!beep->enabled) | ||
41 | return; | ||
42 | |||
40 | /* generate tone */ | 43 | /* generate tone */ |
41 | snd_hda_codec_write_cache(codec, beep->nid, 0, | 44 | snd_hda_codec_write_cache(codec, beep->nid, 0, |
42 | AC_VERB_SET_BEEP_CONTROL, beep->tone); | 45 | AC_VERB_SET_BEEP_CONTROL, beep->tone); |
@@ -85,6 +88,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
85 | snprintf(beep->phys, sizeof(beep->phys), | 88 | snprintf(beep->phys, sizeof(beep->phys), |
86 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); | 89 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); |
87 | input_dev = input_allocate_device(); | 90 | input_dev = input_allocate_device(); |
91 | if (!input_dev) { | ||
92 | kfree(beep); | ||
93 | return -ENOMEM; | ||
94 | } | ||
88 | 95 | ||
89 | /* setup digital beep device */ | 96 | /* setup digital beep device */ |
90 | input_dev->name = "HDA Digital PCBeep"; | 97 | input_dev->name = "HDA Digital PCBeep"; |
@@ -115,6 +122,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
115 | beep->nid = nid; | 122 | beep->nid = nid; |
116 | beep->dev = input_dev; | 123 | beep->dev = input_dev; |
117 | beep->codec = codec; | 124 | beep->codec = codec; |
125 | beep->enabled = 1; | ||
118 | codec->beep = beep; | 126 | codec->beep = beep; |
119 | 127 | ||
120 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); | 128 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); |
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h index de4036e6e710..b9679f081cae 100644 --- a/sound/pci/hda/hda_beep.h +++ b/sound/pci/hda/hda_beep.h | |||
@@ -31,6 +31,7 @@ struct hda_beep { | |||
31 | char phys[32]; | 31 | char phys[32]; |
32 | int tone; | 32 | int tone; |
33 | int nid; | 33 | int nid; |
34 | int enabled; | ||
34 | struct work_struct beep_work; /* scheduled task for beep event */ | 35 | struct work_struct beep_work; /* scheduled task for beep event */ |
35 | }; | 36 | }; |
36 | 37 | ||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index ba1ab737b55f..eb9164176dab 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1436,12 +1436,12 @@ static void set_dig_out(struct hda_codec *codec, hda_nid_t nid, | |||
1436 | { | 1436 | { |
1437 | hda_nid_t *d; | 1437 | hda_nid_t *d; |
1438 | 1438 | ||
1439 | snd_hda_codec_write(codec, nid, 0, verb, val); | 1439 | snd_hda_codec_write_cache(codec, nid, 0, verb, val); |
1440 | d = codec->slave_dig_outs; | 1440 | d = codec->slave_dig_outs; |
1441 | if (!d) | 1441 | if (!d) |
1442 | return; | 1442 | return; |
1443 | for (; *d; d++) | 1443 | for (; *d; d++) |
1444 | snd_hda_codec_write(codec, *d, 0, verb, val); | 1444 | snd_hda_codec_write_cache(codec, *d, 0, verb, val); |
1445 | } | 1445 | } |
1446 | 1446 | ||
1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, | 1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4300a679cd86..5dd3e89f620a 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -36,9 +36,11 @@ | |||
36 | #include "hda_beep.h" | 36 | #include "hda_beep.h" |
37 | 37 | ||
38 | #define NUM_CONTROL_ALLOC 32 | 38 | #define NUM_CONTROL_ALLOC 32 |
39 | |||
40 | #define STAC_VREF_EVENT 0x00 | ||
41 | #define STAC_INSERT_EVENT 0x10 | ||
39 | #define STAC_PWR_EVENT 0x20 | 42 | #define STAC_PWR_EVENT 0x20 |
40 | #define STAC_HP_EVENT 0x30 | 43 | #define STAC_HP_EVENT 0x30 |
41 | #define STAC_VREF_EVENT 0x40 | ||
42 | 44 | ||
43 | enum { | 45 | enum { |
44 | STAC_REF, | 46 | STAC_REF, |
@@ -68,7 +70,9 @@ enum { | |||
68 | 70 | ||
69 | enum { | 71 | enum { |
70 | STAC_92HD73XX_REF, | 72 | STAC_92HD73XX_REF, |
71 | STAC_DELL_M6, | 73 | STAC_DELL_M6_AMIC, |
74 | STAC_DELL_M6_DMIC, | ||
75 | STAC_DELL_M6_BOTH, | ||
72 | STAC_DELL_EQ, | 76 | STAC_DELL_EQ, |
73 | STAC_92HD73XX_MODELS | 77 | STAC_92HD73XX_MODELS |
74 | }; | 78 | }; |
@@ -82,6 +86,7 @@ enum { | |||
82 | STAC_92HD71BXX_REF, | 86 | STAC_92HD71BXX_REF, |
83 | STAC_DELL_M4_1, | 87 | STAC_DELL_M4_1, |
84 | STAC_DELL_M4_2, | 88 | STAC_DELL_M4_2, |
89 | STAC_DELL_M4_3, | ||
85 | STAC_HP_M4, | 90 | STAC_HP_M4, |
86 | STAC_92HD71BXX_MODELS | 91 | STAC_92HD71BXX_MODELS |
87 | }; | 92 | }; |
@@ -135,6 +140,7 @@ struct sigmatel_spec { | |||
135 | unsigned int num_mixers; | 140 | unsigned int num_mixers; |
136 | 141 | ||
137 | int board_config; | 142 | int board_config; |
143 | unsigned int eapd_switch: 1; | ||
138 | unsigned int surr_switch: 1; | 144 | unsigned int surr_switch: 1; |
139 | unsigned int line_switch: 1; | 145 | unsigned int line_switch: 1; |
140 | unsigned int mic_switch: 1; | 146 | unsigned int mic_switch: 1; |
@@ -1598,13 +1604,17 @@ static unsigned int dell_m6_pin_configs[13] = { | |||
1598 | 1604 | ||
1599 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | 1605 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { |
1600 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, | 1606 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, |
1601 | [STAC_DELL_M6] = dell_m6_pin_configs, | 1607 | [STAC_DELL_M6_AMIC] = dell_m6_pin_configs, |
1608 | [STAC_DELL_M6_DMIC] = dell_m6_pin_configs, | ||
1609 | [STAC_DELL_M6_BOTH] = dell_m6_pin_configs, | ||
1602 | [STAC_DELL_EQ] = dell_m6_pin_configs, | 1610 | [STAC_DELL_EQ] = dell_m6_pin_configs, |
1603 | }; | 1611 | }; |
1604 | 1612 | ||
1605 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | 1613 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { |
1606 | [STAC_92HD73XX_REF] = "ref", | 1614 | [STAC_92HD73XX_REF] = "ref", |
1607 | [STAC_DELL_M6] = "dell-m6", | 1615 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", |
1616 | [STAC_DELL_M6_DMIC] = "dell-m6-dmic", | ||
1617 | [STAC_DELL_M6_BOTH] = "dell-m6", | ||
1608 | [STAC_DELL_EQ] = "dell-eq", | 1618 | [STAC_DELL_EQ] = "dell-eq", |
1609 | }; | 1619 | }; |
1610 | 1620 | ||
@@ -1613,19 +1623,23 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1613 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1614 | "DFI LanParty", STAC_92HD73XX_REF), | 1624 | "DFI LanParty", STAC_92HD73XX_REF), |
1615 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, | 1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
1616 | "unknown Dell", STAC_DELL_M6), | 1626 | "Dell Studio 1535", STAC_DELL_M6_DMIC), |
1617 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, | 1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
1618 | "unknown Dell", STAC_DELL_M6), | 1628 | "unknown Dell", STAC_DELL_M6_DMIC), |
1619 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, | 1629 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, |
1620 | "unknown Dell", STAC_DELL_M6), | 1630 | "unknown Dell", STAC_DELL_M6_BOTH), |
1621 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, | 1631 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, |
1622 | "unknown Dell", STAC_DELL_M6), | 1632 | "unknown Dell", STAC_DELL_M6_BOTH), |
1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, | 1633 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, |
1624 | "unknown Dell", STAC_DELL_M6), | 1634 | "unknown Dell", STAC_DELL_M6_AMIC), |
1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, | 1635 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, |
1626 | "unknown Dell", STAC_DELL_M6), | 1636 | "unknown Dell", STAC_DELL_M6_AMIC), |
1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, | 1637 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, |
1628 | "unknown Dell", STAC_DELL_M6), | 1638 | "unknown Dell", STAC_DELL_M6_DMIC), |
1639 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272, | ||
1640 | "unknown Dell", STAC_DELL_M6_DMIC), | ||
1641 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, | ||
1642 | "Dell Studio 1537", STAC_DELL_M6_DMIC), | ||
1629 | {} /* terminator */ | 1643 | {} /* terminator */ |
1630 | }; | 1644 | }; |
1631 | 1645 | ||
@@ -1668,10 +1682,17 @@ static unsigned int dell_m4_2_pin_configs[11] = { | |||
1668 | 0x40f000f0, 0x044413b0, 0x044413b0, | 1682 | 0x40f000f0, 0x044413b0, 0x044413b0, |
1669 | }; | 1683 | }; |
1670 | 1684 | ||
1685 | static unsigned int dell_m4_3_pin_configs[11] = { | ||
1686 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, | ||
1687 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, | ||
1688 | 0x40f000f0, 0x044413b0, 0x044413b0, | ||
1689 | }; | ||
1690 | |||
1671 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | 1691 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { |
1672 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, | 1692 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, |
1673 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, | 1693 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, |
1674 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, | 1694 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, |
1695 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, | ||
1675 | [STAC_HP_M4] = NULL, | 1696 | [STAC_HP_M4] = NULL, |
1676 | }; | 1697 | }; |
1677 | 1698 | ||
@@ -1679,6 +1700,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | |||
1679 | [STAC_92HD71BXX_REF] = "ref", | 1700 | [STAC_92HD71BXX_REF] = "ref", |
1680 | [STAC_DELL_M4_1] = "dell-m4-1", | 1701 | [STAC_DELL_M4_1] = "dell-m4-1", |
1681 | [STAC_DELL_M4_2] = "dell-m4-2", | 1702 | [STAC_DELL_M4_2] = "dell-m4-2", |
1703 | [STAC_DELL_M4_3] = "dell-m4-3", | ||
1682 | [STAC_HP_M4] = "hp-m4", | 1704 | [STAC_HP_M4] = "hp-m4", |
1683 | }; | 1705 | }; |
1684 | 1706 | ||
@@ -1686,6 +1708,10 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
1686 | /* SigmaTel reference board */ | 1708 | /* SigmaTel reference board */ |
1687 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1709 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1688 | "DFI LanParty", STAC_92HD71BXX_REF), | 1710 | "DFI LanParty", STAC_92HD71BXX_REF), |
1711 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2, | ||
1712 | "HP dv5", STAC_HP_M4), | ||
1713 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, | ||
1714 | "HP dv7", STAC_HP_M4), | ||
1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, | 1715 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, |
1690 | "unknown HP", STAC_HP_M4), | 1716 | "unknown HP", STAC_HP_M4), |
1691 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, | 1717 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
@@ -1710,6 +1736,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
1710 | "unknown Dell", STAC_DELL_M4_2), | 1736 | "unknown Dell", STAC_DELL_M4_2), |
1711 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, | 1737 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, |
1712 | "unknown Dell", STAC_DELL_M4_2), | 1738 | "unknown Dell", STAC_DELL_M4_2), |
1739 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa, | ||
1740 | "unknown Dell", STAC_DELL_M4_3), | ||
1713 | {} /* terminator */ | 1741 | {} /* terminator */ |
1714 | }; | 1742 | }; |
1715 | 1743 | ||
@@ -2587,8 +2615,10 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = { | |||
2587 | }; | 2615 | }; |
2588 | 2616 | ||
2589 | /* add dynamic controls */ | 2617 | /* add dynamic controls */ |
2590 | static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | 2618 | static int stac92xx_add_control_temp(struct sigmatel_spec *spec, |
2591 | int idx, const char *name, unsigned long val) | 2619 | struct snd_kcontrol_new *ktemp, |
2620 | int idx, const char *name, | ||
2621 | unsigned long val) | ||
2592 | { | 2622 | { |
2593 | struct snd_kcontrol_new *knew; | 2623 | struct snd_kcontrol_new *knew; |
2594 | 2624 | ||
@@ -2607,20 +2637,29 @@ static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | |||
2607 | } | 2637 | } |
2608 | 2638 | ||
2609 | knew = &spec->kctl_alloc[spec->num_kctl_used]; | 2639 | knew = &spec->kctl_alloc[spec->num_kctl_used]; |
2610 | *knew = stac92xx_control_templates[type]; | 2640 | *knew = *ktemp; |
2611 | knew->index = idx; | 2641 | knew->index = idx; |
2612 | knew->name = kstrdup(name, GFP_KERNEL); | 2642 | knew->name = kstrdup(name, GFP_KERNEL); |
2613 | if (! knew->name) | 2643 | if (!knew->name) |
2614 | return -ENOMEM; | 2644 | return -ENOMEM; |
2615 | knew->private_value = val; | 2645 | knew->private_value = val; |
2616 | spec->num_kctl_used++; | 2646 | spec->num_kctl_used++; |
2617 | return 0; | 2647 | return 0; |
2618 | } | 2648 | } |
2619 | 2649 | ||
2650 | static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec, | ||
2651 | int type, int idx, const char *name, | ||
2652 | unsigned long val) | ||
2653 | { | ||
2654 | return stac92xx_add_control_temp(spec, | ||
2655 | &stac92xx_control_templates[type], | ||
2656 | idx, name, val); | ||
2657 | } | ||
2658 | |||
2620 | 2659 | ||
2621 | /* add dynamic controls */ | 2660 | /* add dynamic controls */ |
2622 | static int stac92xx_add_control(struct sigmatel_spec *spec, int type, | 2661 | static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type, |
2623 | const char *name, unsigned long val) | 2662 | const char *name, unsigned long val) |
2624 | { | 2663 | { |
2625 | return stac92xx_add_control_idx(spec, type, 0, name, val); | 2664 | return stac92xx_add_control_idx(spec, type, 0, name, val); |
2626 | } | 2665 | } |
@@ -2860,7 +2899,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
2860 | cfg->hp_outs && !spec->multiout.hp_nid) | 2899 | cfg->hp_outs && !spec->multiout.hp_nid) |
2861 | spec->multiout.hp_nid = nid; | 2900 | spec->multiout.hp_nid = nid; |
2862 | 2901 | ||
2863 | if (cfg->hp_outs > 1) { | 2902 | if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { |
2864 | err = stac92xx_add_control(spec, | 2903 | err = stac92xx_add_control(spec, |
2865 | STAC_CTL_WIDGET_HP_SWITCH, | 2904 | STAC_CTL_WIDGET_HP_SWITCH, |
2866 | "Headphone as Line Out Switch", | 2905 | "Headphone as Line Out Switch", |
@@ -3062,6 +3101,43 @@ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec, | |||
3062 | return 0; | 3101 | return 0; |
3063 | } | 3102 | } |
3064 | 3103 | ||
3104 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | ||
3105 | #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info | ||
3106 | |||
3107 | static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol, | ||
3108 | struct snd_ctl_elem_value *ucontrol) | ||
3109 | { | ||
3110 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
3111 | ucontrol->value.integer.value[0] = codec->beep->enabled; | ||
3112 | return 0; | ||
3113 | } | ||
3114 | |||
3115 | static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol, | ||
3116 | struct snd_ctl_elem_value *ucontrol) | ||
3117 | { | ||
3118 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
3119 | int enabled = !!ucontrol->value.integer.value[0]; | ||
3120 | if (codec->beep->enabled != enabled) { | ||
3121 | codec->beep->enabled = enabled; | ||
3122 | return 1; | ||
3123 | } | ||
3124 | return 0; | ||
3125 | } | ||
3126 | |||
3127 | static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = { | ||
3128 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
3129 | .info = stac92xx_dig_beep_switch_info, | ||
3130 | .get = stac92xx_dig_beep_switch_get, | ||
3131 | .put = stac92xx_dig_beep_switch_put, | ||
3132 | }; | ||
3133 | |||
3134 | static int stac92xx_beep_switch_ctl(struct hda_codec *codec) | ||
3135 | { | ||
3136 | return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl, | ||
3137 | 0, "PC Beep Playback Switch", 0); | ||
3138 | } | ||
3139 | #endif | ||
3140 | |||
3065 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) | 3141 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) |
3066 | { | 3142 | { |
3067 | struct sigmatel_spec *spec = codec->spec; | 3143 | struct sigmatel_spec *spec = codec->spec; |
@@ -3368,6 +3444,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3368 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 3444 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
3369 | if (spec->digbeep_nid > 0) { | 3445 | if (spec->digbeep_nid > 0) { |
3370 | hda_nid_t nid = spec->digbeep_nid; | 3446 | hda_nid_t nid = spec->digbeep_nid; |
3447 | unsigned int caps; | ||
3371 | 3448 | ||
3372 | err = stac92xx_auto_create_beep_ctls(codec, nid); | 3449 | err = stac92xx_auto_create_beep_ctls(codec, nid); |
3373 | if (err < 0) | 3450 | if (err < 0) |
@@ -3375,6 +3452,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3375 | err = snd_hda_attach_beep_device(codec, nid); | 3452 | err = snd_hda_attach_beep_device(codec, nid); |
3376 | if (err < 0) | 3453 | if (err < 0) |
3377 | return err; | 3454 | return err; |
3455 | /* if no beep switch is available, make its own one */ | ||
3456 | caps = query_amp_caps(codec, nid, HDA_OUTPUT); | ||
3457 | if (codec->beep && | ||
3458 | !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) { | ||
3459 | err = stac92xx_beep_switch_ctl(codec); | ||
3460 | if (err < 0) | ||
3461 | return err; | ||
3462 | } | ||
3378 | } | 3463 | } |
3379 | #endif | 3464 | #endif |
3380 | 3465 | ||
@@ -3620,10 +3705,14 @@ static void stac92xx_power_down(struct hda_codec *codec) | |||
3620 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3705 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
3621 | } | 3706 | } |
3622 | 3707 | ||
3708 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, | ||
3709 | int enable); | ||
3710 | |||
3623 | static int stac92xx_init(struct hda_codec *codec) | 3711 | static int stac92xx_init(struct hda_codec *codec) |
3624 | { | 3712 | { |
3625 | struct sigmatel_spec *spec = codec->spec; | 3713 | struct sigmatel_spec *spec = codec->spec; |
3626 | struct auto_pin_cfg *cfg = &spec->autocfg; | 3714 | struct auto_pin_cfg *cfg = &spec->autocfg; |
3715 | unsigned int gpio; | ||
3627 | int i; | 3716 | int i; |
3628 | 3717 | ||
3629 | snd_hda_sequence_write(codec, spec->init); | 3718 | snd_hda_sequence_write(codec, spec->init); |
@@ -3634,6 +3723,16 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3634 | snd_hda_codec_write_cache(codec, | 3723 | snd_hda_codec_write_cache(codec, |
3635 | spec->adc_nids[i], 0, | 3724 | spec->adc_nids[i], 0, |
3636 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3725 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
3726 | |||
3727 | /* set up GPIO */ | ||
3728 | gpio = spec->gpio_data; | ||
3729 | /* turn on EAPD statically when spec->eapd_switch isn't set. | ||
3730 | * otherwise, unsol event will turn it on/off dynamically | ||
3731 | */ | ||
3732 | if (!spec->eapd_switch) | ||
3733 | gpio |= spec->eapd_mask; | ||
3734 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio); | ||
3735 | |||
3637 | /* set up pins */ | 3736 | /* set up pins */ |
3638 | if (spec->hp_detect) { | 3737 | if (spec->hp_detect) { |
3639 | /* Enable unsolicited responses on the HP widget */ | 3738 | /* Enable unsolicited responses on the HP widget */ |
@@ -3673,39 +3772,43 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3673 | for (i = 0; i < spec->num_dmics; i++) | 3772 | for (i = 0; i < spec->num_dmics; i++) |
3674 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], | 3773 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], |
3675 | AC_PINCTL_IN_EN); | 3774 | AC_PINCTL_IN_EN); |
3775 | if (cfg->dig_out_pin) | ||
3776 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
3777 | AC_PINCTL_OUT_EN); | ||
3778 | if (cfg->dig_in_pin) | ||
3779 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
3780 | AC_PINCTL_IN_EN); | ||
3676 | for (i = 0; i < spec->num_pwrs; i++) { | 3781 | for (i = 0; i < spec->num_pwrs; i++) { |
3677 | int event = is_nid_hp_pin(cfg, spec->pwr_nids[i]) | 3782 | hda_nid_t nid = spec->pwr_nids[i]; |
3678 | ? STAC_HP_EVENT : STAC_PWR_EVENT; | 3783 | int pinctl, def_conf; |
3679 | int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3784 | int event = STAC_PWR_EVENT; |
3680 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | 3785 | |
3681 | int def_conf = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3786 | if (is_nid_hp_pin(cfg, nid) && spec->hp_detect) |
3682 | 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 3787 | continue; /* already has an unsol event */ |
3683 | def_conf = get_defcfg_connect(def_conf); | 3788 | |
3789 | pinctl = snd_hda_codec_read(codec, nid, 0, | ||
3790 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
3684 | /* outputs are only ports capable of power management | 3791 | /* outputs are only ports capable of power management |
3685 | * any attempts on powering down a input port cause the | 3792 | * any attempts on powering down a input port cause the |
3686 | * referenced VREF to act quirky. | 3793 | * referenced VREF to act quirky. |
3687 | */ | 3794 | */ |
3688 | if (pinctl & AC_PINCTL_IN_EN) | 3795 | if (pinctl & AC_PINCTL_IN_EN) |
3689 | continue; | 3796 | continue; |
3797 | def_conf = snd_hda_codec_read(codec, nid, 0, | ||
3798 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3799 | def_conf = get_defcfg_connect(def_conf); | ||
3690 | /* skip any ports that don't have jacks since presence | 3800 | /* skip any ports that don't have jacks since presence |
3691 | * detection is useless */ | 3801 | * detection is useless */ |
3692 | if (def_conf && def_conf != AC_JACK_PORT_FIXED) | 3802 | if (def_conf != AC_JACK_PORT_COMPLEX) { |
3803 | if (def_conf != AC_JACK_PORT_NONE) | ||
3804 | stac_toggle_power_map(codec, nid, 1); | ||
3693 | continue; | 3805 | continue; |
3806 | } | ||
3694 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); | 3807 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); |
3695 | codec->patch_ops.unsol_event(codec, (event | i) << 26); | 3808 | codec->patch_ops.unsol_event(codec, (event | i) << 26); |
3696 | } | 3809 | } |
3697 | if (spec->dac_list) | 3810 | if (spec->dac_list) |
3698 | stac92xx_power_down(codec); | 3811 | stac92xx_power_down(codec); |
3699 | if (cfg->dig_out_pin) | ||
3700 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
3701 | AC_PINCTL_OUT_EN); | ||
3702 | if (cfg->dig_in_pin) | ||
3703 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
3704 | AC_PINCTL_IN_EN); | ||
3705 | |||
3706 | stac_gpio_set(codec, spec->gpio_mask, | ||
3707 | spec->gpio_dir, spec->gpio_data); | ||
3708 | |||
3709 | return 0; | 3812 | return 0; |
3710 | } | 3813 | } |
3711 | 3814 | ||
@@ -3838,7 +3941,7 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
3838 | for (i = 0; i < cfg->speaker_outs; i++) | 3941 | for (i = 0; i < cfg->speaker_outs; i++) |
3839 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], | 3942 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], |
3840 | AC_PINCTL_OUT_EN); | 3943 | AC_PINCTL_OUT_EN); |
3841 | if (spec->eapd_mask) | 3944 | if (spec->eapd_mask && spec->eapd_switch) |
3842 | stac_gpio_set(codec, spec->gpio_mask, | 3945 | stac_gpio_set(codec, spec->gpio_mask, |
3843 | spec->gpio_dir, spec->gpio_data & | 3946 | spec->gpio_dir, spec->gpio_data & |
3844 | ~spec->eapd_mask); | 3947 | ~spec->eapd_mask); |
@@ -3853,7 +3956,7 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
3853 | for (i = 0; i < cfg->speaker_outs; i++) | 3956 | for (i = 0; i < cfg->speaker_outs; i++) |
3854 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], | 3957 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], |
3855 | AC_PINCTL_OUT_EN); | 3958 | AC_PINCTL_OUT_EN); |
3856 | if (spec->eapd_mask) | 3959 | if (spec->eapd_mask && spec->eapd_switch) |
3857 | stac_gpio_set(codec, spec->gpio_mask, | 3960 | stac_gpio_set(codec, spec->gpio_mask, |
3858 | spec->gpio_dir, spec->gpio_data | | 3961 | spec->gpio_dir, spec->gpio_data | |
3859 | spec->eapd_mask); | 3962 | spec->eapd_mask); |
@@ -3870,14 +3973,18 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
3870 | } | 3973 | } |
3871 | } | 3974 | } |
3872 | 3975 | ||
3873 | static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | 3976 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, |
3977 | int enable) | ||
3874 | { | 3978 | { |
3875 | struct sigmatel_spec *spec = codec->spec; | 3979 | struct sigmatel_spec *spec = codec->spec; |
3876 | hda_nid_t nid = spec->pwr_nids[idx]; | 3980 | unsigned int idx, val; |
3877 | int presence, val; | 3981 | |
3878 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) | 3982 | for (idx = 0; idx < spec->num_pwrs; idx++) { |
3879 | & 0x000000ff; | 3983 | if (spec->pwr_nids[idx] == nid) |
3880 | presence = get_hp_pin_presence(codec, nid); | 3984 | break; |
3985 | } | ||
3986 | if (idx >= spec->num_pwrs) | ||
3987 | return; | ||
3881 | 3988 | ||
3882 | /* several codecs have two power down bits */ | 3989 | /* several codecs have two power down bits */ |
3883 | if (spec->pwr_mapping) | 3990 | if (spec->pwr_mapping) |
@@ -3885,14 +3992,20 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | |||
3885 | else | 3992 | else |
3886 | idx = 1 << idx; | 3993 | idx = 1 << idx; |
3887 | 3994 | ||
3888 | if (presence) | 3995 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff; |
3996 | if (enable) | ||
3889 | val &= ~idx; | 3997 | val &= ~idx; |
3890 | else | 3998 | else |
3891 | val |= idx; | 3999 | val |= idx; |
3892 | 4000 | ||
3893 | /* power down unused output ports */ | 4001 | /* power down unused output ports */ |
3894 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); | 4002 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); |
3895 | }; | 4003 | } |
4004 | |||
4005 | static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid) | ||
4006 | { | ||
4007 | stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid)); | ||
4008 | } | ||
3896 | 4009 | ||
3897 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | 4010 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) |
3898 | { | 4011 | { |
@@ -4176,31 +4289,29 @@ again: | |||
4176 | case STAC_DELL_EQ: | 4289 | case STAC_DELL_EQ: |
4177 | spec->init = dell_eq_core_init; | 4290 | spec->init = dell_eq_core_init; |
4178 | /* fallthru */ | 4291 | /* fallthru */ |
4179 | case STAC_DELL_M6: | 4292 | case STAC_DELL_M6_AMIC: |
4293 | case STAC_DELL_M6_DMIC: | ||
4294 | case STAC_DELL_M6_BOTH: | ||
4180 | spec->num_smuxes = 0; | 4295 | spec->num_smuxes = 0; |
4181 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; | 4296 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; |
4182 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; | 4297 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; |
4298 | spec->eapd_switch = 0; | ||
4183 | spec->num_amps = 1; | 4299 | spec->num_amps = 1; |
4184 | 4300 | ||
4185 | if (!spec->init) | 4301 | if (!spec->init) |
4186 | spec->init = dell_m6_core_init; | 4302 | spec->init = dell_m6_core_init; |
4187 | switch (codec->subsystem_id) { | 4303 | switch (spec->board_config) { |
4188 | case 0x1028025e: /* Analog Mics */ | 4304 | case STAC_DELL_M6_AMIC: /* Analog Mics */ |
4189 | case 0x1028025f: | ||
4190 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4305 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
4191 | spec->num_dmics = 0; | 4306 | spec->num_dmics = 0; |
4192 | spec->private_dimux.num_items = 1; | 4307 | spec->private_dimux.num_items = 1; |
4193 | break; | 4308 | break; |
4194 | case 0x10280271: /* Digital Mics */ | 4309 | case STAC_DELL_M6_DMIC: /* Digital Mics */ |
4195 | case 0x10280272: | ||
4196 | case 0x10280254: | ||
4197 | case 0x10280255: | ||
4198 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4310 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
4199 | spec->num_dmics = 1; | 4311 | spec->num_dmics = 1; |
4200 | spec->private_dimux.num_items = 2; | 4312 | spec->private_dimux.num_items = 2; |
4201 | break; | 4313 | break; |
4202 | case 0x10280256: /* Both */ | 4314 | case STAC_DELL_M6_BOTH: /* Both */ |
4203 | case 0x10280057: | ||
4204 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4315 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
4205 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4316 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
4206 | spec->num_dmics = 1; | 4317 | spec->num_dmics = 1; |
@@ -4211,6 +4322,7 @@ again: | |||
4211 | default: | 4322 | default: |
4212 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; | 4323 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; |
4213 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); | 4324 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); |
4325 | spec->eapd_switch = 1; | ||
4214 | } | 4326 | } |
4215 | if (spec->board_config > STAC_92HD73XX_REF) { | 4327 | if (spec->board_config > STAC_92HD73XX_REF) { |
4216 | /* GPIO0 High = Enable EAPD */ | 4328 | /* GPIO0 High = Enable EAPD */ |
@@ -4356,7 +4468,13 @@ static int stac92hd71xx_resume(struct hda_codec *codec) | |||
4356 | 4468 | ||
4357 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) | 4469 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) |
4358 | { | 4470 | { |
4471 | struct sigmatel_spec *spec = codec->spec; | ||
4472 | |||
4359 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); | 4473 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); |
4474 | if (spec->eapd_mask) | ||
4475 | stac_gpio_set(codec, spec->gpio_mask, | ||
4476 | spec->gpio_dir, spec->gpio_data & | ||
4477 | ~spec->eapd_mask); | ||
4360 | return 0; | 4478 | return 0; |
4361 | }; | 4479 | }; |
4362 | 4480 | ||
@@ -4419,6 +4537,13 @@ again: | |||
4419 | stac92xx_set_config_regs(codec); | 4537 | stac92xx_set_config_regs(codec); |
4420 | } | 4538 | } |
4421 | 4539 | ||
4540 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
4541 | /* GPIO0 = EAPD */ | ||
4542 | spec->gpio_mask = 0x01; | ||
4543 | spec->gpio_dir = 0x01; | ||
4544 | spec->gpio_data = 0x01; | ||
4545 | } | ||
4546 | |||
4422 | switch (codec->vendor_id) { | 4547 | switch (codec->vendor_id) { |
4423 | case 0x111d76b6: /* 4 Port without Analog Mixer */ | 4548 | case 0x111d76b6: /* 4 Port without Analog Mixer */ |
4424 | case 0x111d76b7: | 4549 | case 0x111d76b7: |
@@ -4429,10 +4554,10 @@ again: | |||
4429 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; | 4554 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; |
4430 | break; | 4555 | break; |
4431 | case 0x111d7608: /* 5 Port with Analog Mixer */ | 4556 | case 0x111d7608: /* 5 Port with Analog Mixer */ |
4432 | switch (codec->subsystem_id) { | 4557 | switch (spec->board_config) { |
4433 | case 0x103c361a: | 4558 | case STAC_HP_M4: |
4434 | /* Enable VREF power saving on GPIO1 detect */ | 4559 | /* Enable VREF power saving on GPIO1 detect */ |
4435 | snd_hda_codec_write(codec, codec->afg, 0, | 4560 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4436 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); | 4561 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); |
4437 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4562 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4438 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4563 | AC_VERB_SET_UNSOLICITED_ENABLE, |
@@ -4478,13 +4603,6 @@ again: | |||
4478 | spec->aloopback_mask = 0x50; | 4603 | spec->aloopback_mask = 0x50; |
4479 | spec->aloopback_shift = 0; | 4604 | spec->aloopback_shift = 0; |
4480 | 4605 | ||
4481 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
4482 | /* GPIO0 = EAPD */ | ||
4483 | spec->gpio_mask = 0x01; | ||
4484 | spec->gpio_dir = 0x01; | ||
4485 | spec->gpio_data = 0x01; | ||
4486 | } | ||
4487 | |||
4488 | spec->powerdown_adcs = 1; | 4606 | spec->powerdown_adcs = 1; |
4489 | spec->digbeep_nid = 0x26; | 4607 | spec->digbeep_nid = 0x26; |
4490 | spec->mux_nids = stac92hd71bxx_mux_nids; | 4608 | spec->mux_nids = stac92hd71bxx_mux_nids; |
@@ -4499,14 +4617,21 @@ again: | |||
4499 | 4617 | ||
4500 | switch (spec->board_config) { | 4618 | switch (spec->board_config) { |
4501 | case STAC_HP_M4: | 4619 | case STAC_HP_M4: |
4502 | spec->num_dmics = 0; | ||
4503 | spec->num_smuxes = 0; | ||
4504 | spec->num_dmuxes = 0; | ||
4505 | |||
4506 | /* enable internal microphone */ | 4620 | /* enable internal microphone */ |
4507 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); | 4621 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); |
4508 | stac92xx_auto_set_pinctl(codec, 0x0e, | 4622 | stac92xx_auto_set_pinctl(codec, 0x0e, |
4509 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); | 4623 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); |
4624 | /* fallthru */ | ||
4625 | case STAC_DELL_M4_2: | ||
4626 | spec->num_dmics = 0; | ||
4627 | spec->num_smuxes = 0; | ||
4628 | spec->num_dmuxes = 0; | ||
4629 | break; | ||
4630 | case STAC_DELL_M4_1: | ||
4631 | case STAC_DELL_M4_3: | ||
4632 | spec->num_dmics = 1; | ||
4633 | spec->num_smuxes = 0; | ||
4634 | spec->num_dmuxes = 0; | ||
4510 | break; | 4635 | break; |
4511 | default: | 4636 | default: |
4512 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; | 4637 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; |
@@ -4743,6 +4868,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
4743 | spec->num_pwrs = 0; | 4868 | spec->num_pwrs = 0; |
4744 | spec->aloopback_mask = 0x40; | 4869 | spec->aloopback_mask = 0x40; |
4745 | spec->aloopback_shift = 0; | 4870 | spec->aloopback_shift = 0; |
4871 | spec->eapd_switch = 1; | ||
4746 | 4872 | ||
4747 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); | 4873 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); |
4748 | if (!err) { | 4874 | if (!err) { |
@@ -4823,6 +4949,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
4823 | 4949 | ||
4824 | spec->aloopback_mask = 0x40; | 4950 | spec->aloopback_mask = 0x40; |
4825 | spec->aloopback_shift = 0; | 4951 | spec->aloopback_shift = 0; |
4952 | spec->eapd_switch = 1; | ||
4826 | spec->multiout.dac_nids = spec->dac_nids; | 4953 | spec->multiout.dac_nids = spec->dac_nids; |
4827 | 4954 | ||
4828 | switch (spec->board_config){ | 4955 | switch (spec->board_config){ |
@@ -4832,7 +4959,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
4832 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); | 4959 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); |
4833 | 4960 | ||
4834 | /* Enable unsol response for GPIO4/Dock HP connection */ | 4961 | /* Enable unsol response for GPIO4/Dock HP connection */ |
4835 | snd_hda_codec_write(codec, codec->afg, 0, | 4962 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4836 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); | 4963 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); |
4837 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4964 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4838 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4965 | AC_VERB_SET_UNSOLICITED_ENABLE, |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 1b3f11702713..0dfa0540ce2c 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
@@ -382,23 +382,25 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id) | |||
382 | unsigned char status_mask = | 382 | unsigned char status_mask = |
383 | VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX | VT1724_IRQ_MTPCM; | 383 | VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX | VT1724_IRQ_MTPCM; |
384 | int handled = 0; | 384 | int handled = 0; |
385 | #ifdef CONFIG_SND_DEBUG | ||
386 | int timeout = 0; | 385 | int timeout = 0; |
387 | #endif | ||
388 | 386 | ||
389 | while (1) { | 387 | while (1) { |
390 | status = inb(ICEREG1724(ice, IRQSTAT)); | 388 | status = inb(ICEREG1724(ice, IRQSTAT)); |
391 | status &= status_mask; | 389 | status &= status_mask; |
392 | if (status == 0) | 390 | if (status == 0) |
393 | break; | 391 | break; |
394 | #ifdef CONFIG_SND_DEBUG | ||
395 | if (++timeout > 10) { | 392 | if (++timeout > 10) { |
396 | printk(KERN_ERR | 393 | status = inb(ICEREG1724(ice, IRQSTAT)); |
397 | "ice1724: Too long irq loop, status = 0x%x\n", | 394 | printk(KERN_ERR "ice1724: Too long irq loop, " |
398 | status); | 395 | "status = 0x%x\n", status); |
396 | if (status & VT1724_IRQ_MPU_TX) { | ||
397 | printk(KERN_ERR "ice1724: Disabling MPU_TX\n"); | ||
398 | outb(inb(ICEREG1724(ice, IRQMASK)) | | ||
399 | VT1724_IRQ_MPU_TX, | ||
400 | ICEREG1724(ice, IRQMASK)); | ||
401 | } | ||
399 | break; | 402 | break; |
400 | } | 403 | } |
401 | #endif | ||
402 | handled = 1; | 404 | handled = 1; |
403 | if (status & VT1724_IRQ_MPU_TX) { | 405 | if (status & VT1724_IRQ_MPU_TX) { |
404 | spin_lock(&ice->reg_lock); | 406 | spin_lock(&ice->reg_lock); |
@@ -2351,7 +2353,6 @@ static int __devinit snd_vt1724_create(struct snd_card *card, | |||
2351 | { | 2353 | { |
2352 | struct snd_ice1712 *ice; | 2354 | struct snd_ice1712 *ice; |
2353 | int err; | 2355 | int err; |
2354 | unsigned char mask; | ||
2355 | static struct snd_device_ops ops = { | 2356 | static struct snd_device_ops ops = { |
2356 | .dev_free = snd_vt1724_dev_free, | 2357 | .dev_free = snd_vt1724_dev_free, |
2357 | }; | 2358 | }; |
@@ -2412,9 +2413,9 @@ static int __devinit snd_vt1724_create(struct snd_card *card, | |||
2412 | return -EIO; | 2413 | return -EIO; |
2413 | } | 2414 | } |
2414 | 2415 | ||
2415 | /* unmask used interrupts */ | 2416 | /* MPU_RX and TX irq masks are cleared later dynamically */ |
2416 | mask = VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX; | 2417 | outb(VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX , ICEREG1724(ice, IRQMASK)); |
2417 | outb(mask, ICEREG1724(ice, IRQMASK)); | 2418 | |
2418 | /* don't handle FIFO overrun/underruns (just yet), | 2419 | /* don't handle FIFO overrun/underruns (just yet), |
2419 | * since they cause machine lockups | 2420 | * since they cause machine lockups |
2420 | */ | 2421 | */ |
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index ae7601f353a7..f23a73577c22 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c | |||
@@ -1010,7 +1010,7 @@ static int __devinit snd_mixart_create(struct mixart_mgr *mgr, struct snd_card * | |||
1010 | .dev_free = snd_mixart_chip_dev_free, | 1010 | .dev_free = snd_mixart_chip_dev_free, |
1011 | }; | 1011 | }; |
1012 | 1012 | ||
1013 | mgr->chip[idx] = chip = kzalloc(sizeof(*chip), GFP_KERNEL); | 1013 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); |
1014 | if (! chip) { | 1014 | if (! chip) { |
1015 | snd_printk(KERN_ERR "cannot allocate chip\n"); | 1015 | snd_printk(KERN_ERR "cannot allocate chip\n"); |
1016 | return -ENOMEM; | 1016 | return -ENOMEM; |
@@ -1025,6 +1025,7 @@ static int __devinit snd_mixart_create(struct mixart_mgr *mgr, struct snd_card * | |||
1025 | return err; | 1025 | return err; |
1026 | } | 1026 | } |
1027 | 1027 | ||
1028 | mgr->chip[idx] = chip; | ||
1028 | snd_card_set_dev(card, &mgr->pci->dev); | 1029 | snd_card_set_dev(card, &mgr->pci->dev); |
1029 | 1030 | ||
1030 | return 0; | 1031 | return 0; |
@@ -1377,6 +1378,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, | |||
1377 | sprintf(card->longname, "%s [PCM #%d]", mgr->longname, i); | 1378 | sprintf(card->longname, "%s [PCM #%d]", mgr->longname, i); |
1378 | 1379 | ||
1379 | if ((err = snd_mixart_create(mgr, card, i)) < 0) { | 1380 | if ((err = snd_mixart_create(mgr, card, i)) < 0) { |
1381 | snd_card_free(card); | ||
1380 | snd_mixart_free(mgr); | 1382 | snd_mixart_free(mgr); |
1381 | return err; | 1383 | return err; |
1382 | } | 1384 | } |
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 0e06c6c9fcc0..7d2b136295d5 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c | |||
@@ -1024,7 +1024,7 @@ static int __devinit pcxhr_create(struct pcxhr_mgr *mgr, struct snd_card *card, | |||
1024 | .dev_free = pcxhr_chip_dev_free, | 1024 | .dev_free = pcxhr_chip_dev_free, |
1025 | }; | 1025 | }; |
1026 | 1026 | ||
1027 | mgr->chip[idx] = chip = kzalloc(sizeof(*chip), GFP_KERNEL); | 1027 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); |
1028 | if (! chip) { | 1028 | if (! chip) { |
1029 | snd_printk(KERN_ERR "cannot allocate chip\n"); | 1029 | snd_printk(KERN_ERR "cannot allocate chip\n"); |
1030 | return -ENOMEM; | 1030 | return -ENOMEM; |
@@ -1050,6 +1050,7 @@ static int __devinit pcxhr_create(struct pcxhr_mgr *mgr, struct snd_card *card, | |||
1050 | return err; | 1050 | return err; |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | mgr->chip[idx] = chip; | ||
1053 | snd_card_set_dev(card, &mgr->pci->dev); | 1054 | snd_card_set_dev(card, &mgr->pci->dev); |
1054 | 1055 | ||
1055 | return 0; | 1056 | return 0; |
@@ -1229,8 +1230,11 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id | |||
1229 | return -ENOMEM; | 1230 | return -ENOMEM; |
1230 | } | 1231 | } |
1231 | 1232 | ||
1232 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) | 1233 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) { |
1234 | kfree(mgr); | ||
1235 | pci_disable_device(pci); | ||
1233 | return -ENODEV; | 1236 | return -ENODEV; |
1237 | } | ||
1234 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; | 1238 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; |
1235 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; | 1239 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; |
1236 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; | 1240 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; |
@@ -1307,6 +1311,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id | |||
1307 | sprintf(card->longname, "%s [PCM #%d]", mgr->longname, i); | 1311 | sprintf(card->longname, "%s [PCM #%d]", mgr->longname, i); |
1308 | 1312 | ||
1309 | if ((err = pcxhr_create(mgr, card, i)) < 0) { | 1313 | if ((err = pcxhr_create(mgr, card, i)) < 0) { |
1314 | snd_card_free(card); | ||
1310 | pcxhr_free(mgr); | 1315 | pcxhr_free(mgr); |
1311 | return err; | 1316 | return err; |
1312 | } | 1317 | } |
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index e9f0706ed3e4..d0ccfc68c522 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c | |||
@@ -172,7 +172,7 @@ MODULE_PARM_DESC(opl3_port, "OPL3 port # for Riptide driver."); | |||
172 | 172 | ||
173 | #define MAX_WRITE_RETRY 10 /* cmd interface limits */ | 173 | #define MAX_WRITE_RETRY 10 /* cmd interface limits */ |
174 | #define MAX_ERROR_COUNT 10 | 174 | #define MAX_ERROR_COUNT 10 |
175 | #define CMDIF_TIMEOUT 500000 | 175 | #define CMDIF_TIMEOUT 50000 |
176 | #define RESET_TRIES 5 | 176 | #define RESET_TRIES 5 |
177 | 177 | ||
178 | #define READ_PORT_ULONG(p) inl((unsigned long)&(p)) | 178 | #define READ_PORT_ULONG(p) inl((unsigned long)&(p)) |