diff options
Diffstat (limited to 'sound')
28 files changed, 260 insertions, 129 deletions
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index c5699863643b..656e474dca47 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c | |||
@@ -441,6 +441,7 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | |||
441 | struct snd_pcm_hw_params *params) | 441 | struct snd_pcm_hw_params *params) |
442 | { | 442 | { |
443 | int err; | 443 | int err; |
444 | struct aaci *aaci = substream->private_data; | ||
444 | 445 | ||
445 | aaci_pcm_hw_free(substream); | 446 | aaci_pcm_hw_free(substream); |
446 | if (aacirun->pcm_open) { | 447 | if (aacirun->pcm_open) { |
@@ -560,7 +561,6 @@ static int aaci_pcm_open(struct snd_pcm_substream *substream) | |||
560 | static int aaci_pcm_playback_hw_params(struct snd_pcm_substream *substream, | 561 | static int aaci_pcm_playback_hw_params(struct snd_pcm_substream *substream, |
561 | struct snd_pcm_hw_params *params) | 562 | struct snd_pcm_hw_params *params) |
562 | { | 563 | { |
563 | struct aaci *aaci = substream->private_data; | ||
564 | struct aaci_runtime *aacirun = substream->runtime->private_data; | 564 | struct aaci_runtime *aacirun = substream->runtime->private_data; |
565 | unsigned int channels = params_channels(params); | 565 | unsigned int channels = params_channels(params); |
566 | int ret; | 566 | int ret; |
@@ -659,7 +659,6 @@ static struct snd_pcm_ops aaci_playback_ops = { | |||
659 | static int aaci_pcm_capture_hw_params(struct snd_pcm_substream *substream, | 659 | static int aaci_pcm_capture_hw_params(struct snd_pcm_substream *substream, |
660 | struct snd_pcm_hw_params *params) | 660 | struct snd_pcm_hw_params *params) |
661 | { | 661 | { |
662 | struct aaci *aaci = substream->private_data; | ||
663 | struct aaci_runtime *aacirun = substream->runtime->private_data; | 662 | struct aaci_runtime *aacirun = substream->runtime->private_data; |
664 | int ret; | 663 | int ret; |
665 | 664 | ||
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 29ab46a12e11..25b0641e6b8c 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -1918,13 +1918,13 @@ int snd_pcm_hw_constraints_complete(struct snd_pcm_substream *substream) | |||
1918 | 1918 | ||
1919 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE, | 1919 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE, |
1920 | hw->rate_min, hw->rate_max); | 1920 | hw->rate_min, hw->rate_max); |
1921 | if (err < 0) | 1921 | if (err < 0) |
1922 | return err; | 1922 | return err; |
1923 | 1923 | ||
1924 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, | 1924 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, |
1925 | hw->period_bytes_min, hw->period_bytes_max); | 1925 | hw->period_bytes_min, hw->period_bytes_max); |
1926 | if (err < 0) | 1926 | if (err < 0) |
1927 | return err; | 1927 | return err; |
1928 | 1928 | ||
1929 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIODS, | 1929 | err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIODS, |
1930 | hw->periods_min, hw->periods_max); | 1930 | hw->periods_min, hw->periods_max); |
diff --git a/sound/core/sound.c b/sound/core/sound.c index 7872a02f6ca9..563d1967a0ad 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c | |||
@@ -468,5 +468,5 @@ static void __exit alsa_sound_exit(void) | |||
468 | unregister_chrdev(major, "alsa"); | 468 | unregister_chrdev(major, "alsa"); |
469 | } | 469 | } |
470 | 470 | ||
471 | module_init(alsa_sound_init) | 471 | subsys_initcall(alsa_sound_init); |
472 | module_exit(alsa_sound_exit) | 472 | module_exit(alsa_sound_exit); |
diff --git a/sound/core/sound_oss.c b/sound/core/sound_oss.c index 7fe12264ff80..0c164e5e4322 100644 --- a/sound/core/sound_oss.c +++ b/sound/core/sound_oss.c | |||
@@ -93,7 +93,7 @@ static int snd_oss_kernel_minor(int type, struct snd_card *card, int dev) | |||
93 | default: | 93 | default: |
94 | return -EINVAL; | 94 | return -EINVAL; |
95 | } | 95 | } |
96 | if (snd_BUG_ON(minor < 0 || minor >= SNDRV_OSS_MINORS)) | 96 | if (minor < 0 || minor >= SNDRV_OSS_MINORS) |
97 | return -EINVAL; | 97 | return -EINVAL; |
98 | return minor; | 98 | return minor; |
99 | } | 99 | } |
diff --git a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c index 751762f1c59a..0c40951b6523 100644 --- a/sound/isa/sb/emu8000.c +++ b/sound/isa/sb/emu8000.c | |||
@@ -377,12 +377,13 @@ init_arrays(struct snd_emu8000 *emu) | |||
377 | static void __devinit | 377 | static void __devinit |
378 | size_dram(struct snd_emu8000 *emu) | 378 | size_dram(struct snd_emu8000 *emu) |
379 | { | 379 | { |
380 | int i, size; | 380 | int i, size, detected_size; |
381 | 381 | ||
382 | if (emu->dram_checked) | 382 | if (emu->dram_checked) |
383 | return; | 383 | return; |
384 | 384 | ||
385 | size = 0; | 385 | size = 0; |
386 | detected_size = 0; | ||
386 | 387 | ||
387 | /* write out a magic number */ | 388 | /* write out a magic number */ |
388 | snd_emu8000_dma_chan(emu, 0, EMU8000_RAM_WRITE); | 389 | snd_emu8000_dma_chan(emu, 0, EMU8000_RAM_WRITE); |
@@ -393,6 +394,8 @@ size_dram(struct snd_emu8000 *emu) | |||
393 | 394 | ||
394 | while (size < EMU8000_MAX_DRAM) { | 395 | while (size < EMU8000_MAX_DRAM) { |
395 | 396 | ||
397 | size += 512 * 1024; /* increment 512kbytes */ | ||
398 | |||
396 | /* Write a unique data on the test address. | 399 | /* Write a unique data on the test address. |
397 | * if the address is out of range, the data is written on | 400 | * if the address is out of range, the data is written on |
398 | * 0x200000(=EMU8000_DRAM_OFFSET). Then the id word is | 401 | * 0x200000(=EMU8000_DRAM_OFFSET). Then the id word is |
@@ -414,7 +417,7 @@ size_dram(struct snd_emu8000 *emu) | |||
414 | if (EMU8000_SMLD_READ(emu) != UNIQUE_ID2) | 417 | if (EMU8000_SMLD_READ(emu) != UNIQUE_ID2) |
415 | break; /* no memory at this address */ | 418 | break; /* no memory at this address */ |
416 | 419 | ||
417 | size += 512 * 1024; /* increment 512kbytes */ | 420 | detected_size = size; |
418 | 421 | ||
419 | snd_emu8000_read_wait(emu); | 422 | snd_emu8000_read_wait(emu); |
420 | 423 | ||
@@ -442,9 +445,9 @@ size_dram(struct snd_emu8000 *emu) | |||
442 | snd_emu8000_dma_chan(emu, 1, EMU8000_RAM_CLOSE); | 445 | snd_emu8000_dma_chan(emu, 1, EMU8000_RAM_CLOSE); |
443 | 446 | ||
444 | snd_printdd("EMU8000 [0x%lx]: %d Kb on-board memory detected\n", | 447 | snd_printdd("EMU8000 [0x%lx]: %d Kb on-board memory detected\n", |
445 | emu->port1, size/1024); | 448 | emu->port1, detected_size/1024); |
446 | 449 | ||
447 | emu->mem_size = size; | 450 | emu->mem_size = detected_size; |
448 | emu->dram_checked = 1; | 451 | emu->dram_checked = 1; |
449 | } | 452 | } |
450 | 453 | ||
diff --git a/sound/oss/dev_table.c b/sound/oss/dev_table.c index 08274c995d06..727bdb9ba2dc 100644 --- a/sound/oss/dev_table.c +++ b/sound/oss/dev_table.c | |||
@@ -67,14 +67,15 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver, | |||
67 | return -(EBUSY); | 67 | return -(EBUSY); |
68 | } | 68 | } |
69 | d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver))); | 69 | d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver))); |
70 | 70 | sound_nblocks++; | |
71 | if (sound_nblocks < 1024) | 71 | if (sound_nblocks >= MAX_MEM_BLOCKS) |
72 | sound_nblocks++; | 72 | sound_nblocks = MAX_MEM_BLOCKS - 1; |
73 | 73 | ||
74 | op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations))); | 74 | op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations))); |
75 | sound_nblocks++; | ||
76 | if (sound_nblocks >= MAX_MEM_BLOCKS) | ||
77 | sound_nblocks = MAX_MEM_BLOCKS - 1; | ||
75 | 78 | ||
76 | if (sound_nblocks < 1024) | ||
77 | sound_nblocks++; | ||
78 | if (d == NULL || op == NULL) { | 79 | if (d == NULL || op == NULL) { |
79 | printk(KERN_ERR "Sound: Can't allocate driver for (%s)\n", name); | 80 | printk(KERN_ERR "Sound: Can't allocate driver for (%s)\n", name); |
80 | sound_unload_audiodev(num); | 81 | sound_unload_audiodev(num); |
@@ -128,9 +129,10 @@ int sound_install_mixer(int vers, char *name, struct mixer_operations *driver, | |||
128 | until you unload sound! */ | 129 | until you unload sound! */ |
129 | 130 | ||
130 | op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations))); | 131 | op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations))); |
132 | sound_nblocks++; | ||
133 | if (sound_nblocks >= MAX_MEM_BLOCKS) | ||
134 | sound_nblocks = MAX_MEM_BLOCKS - 1; | ||
131 | 135 | ||
132 | if (sound_nblocks < 1024) | ||
133 | sound_nblocks++; | ||
134 | if (op == NULL) { | 136 | if (op == NULL) { |
135 | printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name); | 137 | printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name); |
136 | return -ENOMEM; | 138 | return -ENOMEM; |
diff --git a/sound/oss/sound_config.h b/sound/oss/sound_config.h index 55271fbe7f49..9d35c4c65b9b 100644 --- a/sound/oss/sound_config.h +++ b/sound/oss/sound_config.h | |||
@@ -142,4 +142,6 @@ static inline int translate_mode(struct file *file) | |||
142 | #define TIMER_ARMED 121234 | 142 | #define TIMER_ARMED 121234 |
143 | #define TIMER_NOT_ARMED 1 | 143 | #define TIMER_NOT_ARMED 1 |
144 | 144 | ||
145 | #define MAX_MEM_BLOCKS 1024 | ||
146 | |||
145 | #endif | 147 | #endif |
diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 61aaedae6b7e..c62530943888 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c | |||
@@ -56,7 +56,7 @@ | |||
56 | /* | 56 | /* |
57 | * Table for permanently allocated memory (used when unloading the module) | 57 | * Table for permanently allocated memory (used when unloading the module) |
58 | */ | 58 | */ |
59 | void * sound_mem_blocks[1024]; | 59 | void * sound_mem_blocks[MAX_MEM_BLOCKS]; |
60 | int sound_nblocks = 0; | 60 | int sound_nblocks = 0; |
61 | 61 | ||
62 | /* Persistent DMA buffers */ | 62 | /* Persistent DMA buffers */ |
@@ -574,7 +574,7 @@ static int __init oss_init(void) | |||
574 | NULL, "%s%d", dev_list[i].name, j); | 574 | NULL, "%s%d", dev_list[i].name, j); |
575 | } | 575 | } |
576 | 576 | ||
577 | if (sound_nblocks >= 1024) | 577 | if (sound_nblocks >= MAX_MEM_BLOCKS - 1) |
578 | printk(KERN_ERR "Sound warning: Deallocation table was too small.\n"); | 578 | printk(KERN_ERR "Sound warning: Deallocation table was too small.\n"); |
579 | 579 | ||
580 | return 0; | 580 | return 0; |
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index c11920623009..a7630e9edf8a 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -83,6 +83,7 @@ static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = { | |||
83 | { 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL }, | 83 | { 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL }, |
84 | { 0x50534300, 0xffffff00, "Philips", NULL, NULL }, | 84 | { 0x50534300, 0xffffff00, "Philips", NULL, NULL }, |
85 | { 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL, NULL }, | 85 | { 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL, NULL }, |
86 | { 0x53544d00, 0xffffff00, "STMicroelectronics", NULL, NULL }, | ||
86 | { 0x54524100, 0xffffff00, "TriTech", NULL, NULL }, | 87 | { 0x54524100, 0xffffff00, "TriTech", NULL, NULL }, |
87 | { 0x54584e00, 0xffffff00, "Texas Instruments", NULL, NULL }, | 88 | { 0x54584e00, 0xffffff00, "Texas Instruments", NULL, NULL }, |
88 | { 0x56494100, 0xffffff00, "VIA Technologies", NULL, NULL }, | 89 | { 0x56494100, 0xffffff00, "VIA Technologies", NULL, NULL }, |
@@ -161,6 +162,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { | |||
161 | { 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix | 162 | { 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix |
162 | { 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL }, | 163 | { 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL }, |
163 | { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, | 164 | { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, |
165 | { 0x53544d02, 0xffffffff, "ST7597", NULL, NULL }, | ||
164 | { 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, | 166 | { 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, |
165 | { 0x54524103, 0xffffffff, "TR28023", NULL, NULL }, | 167 | { 0x54524103, 0xffffffff, "TR28023", NULL, NULL }, |
166 | { 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, | 168 | { 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, |
@@ -213,6 +215,14 @@ static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg) | |||
213 | { | 215 | { |
214 | /* filter some registers for buggy codecs */ | 216 | /* filter some registers for buggy codecs */ |
215 | switch (ac97->id) { | 217 | switch (ac97->id) { |
218 | case AC97_ID_ST_AC97_ID4: | ||
219 | if (reg == 0x08) | ||
220 | return 0; | ||
221 | /* fall through */ | ||
222 | case AC97_ID_ST7597: | ||
223 | if (reg == 0x22 || reg == 0x7a) | ||
224 | return 1; | ||
225 | /* fall through */ | ||
216 | case AC97_ID_AK4540: | 226 | case AC97_ID_AK4540: |
217 | case AC97_ID_AK4542: | 227 | case AC97_ID_AK4542: |
218 | if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c) | 228 | if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c) |
diff --git a/sound/pci/ac97/ac97_id.h b/sound/pci/ac97/ac97_id.h index c129492c82b3..d603147c4a96 100644 --- a/sound/pci/ac97/ac97_id.h +++ b/sound/pci/ac97/ac97_id.h | |||
@@ -62,3 +62,5 @@ | |||
62 | #define AC97_ID_CM9761_78 0x434d4978 | 62 | #define AC97_ID_CM9761_78 0x434d4978 |
63 | #define AC97_ID_CM9761_82 0x434d4982 | 63 | #define AC97_ID_CM9761_82 0x434d4982 |
64 | #define AC97_ID_CM9761_83 0x434d4983 | 64 | #define AC97_ID_CM9761_83 0x434d4983 |
65 | #define AC97_ID_ST7597 0x53544d02 | ||
66 | #define AC97_ID_ST_AC97_ID4 0x53544d04 | ||
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c index 139cf3b2b9d7..d9266bae2849 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c | |||
@@ -1870,6 +1870,7 @@ static unsigned int ad1981_jacks_blacklist[] = { | |||
1870 | 0x10140554, /* Thinkpad T42p/R50p */ | 1870 | 0x10140554, /* Thinkpad T42p/R50p */ |
1871 | 0x10140567, /* Thinkpad T43p 2668-G7U */ | 1871 | 0x10140567, /* Thinkpad T43p 2668-G7U */ |
1872 | 0x10140581, /* Thinkpad X41-2527 */ | 1872 | 0x10140581, /* Thinkpad X41-2527 */ |
1873 | 0x10280160, /* Dell Dimension 2400 */ | ||
1873 | 0x104380b0, /* Asus A7V8X-MX */ | 1874 | 0x104380b0, /* Asus A7V8X-MX */ |
1874 | 0x11790241, /* Toshiba Satellite A-15 S127 */ | 1875 | 0x11790241, /* Toshiba Satellite A-15 S127 */ |
1875 | 0x144dc01a, /* Samsung NP-X20C004/SEG */ | 1876 | 0x144dc01a, /* Samsung NP-X20C004/SEG */ |
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index d6752dff2a44..42b4fbbd8e2b 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c | |||
@@ -297,6 +297,7 @@ static struct pci_device_id snd_atiixp_ids[] = { | |||
297 | MODULE_DEVICE_TABLE(pci, snd_atiixp_ids); | 297 | MODULE_DEVICE_TABLE(pci, snd_atiixp_ids); |
298 | 298 | ||
299 | static struct snd_pci_quirk atiixp_quirks[] __devinitdata = { | 299 | static struct snd_pci_quirk atiixp_quirks[] __devinitdata = { |
300 | SND_PCI_QUIRK(0x105b, 0x0c81, "Foxconn RC4107MA-RS2", 0), | ||
300 | SND_PCI_QUIRK(0x15bd, 0x3100, "DFI RS482", 0), | 301 | SND_PCI_QUIRK(0x15bd, 0x3100, "DFI RS482", 0), |
301 | { } /* terminator */ | 302 | { } /* terminator */ |
302 | }; | 303 | }; |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 5fe34a8d8c81..e4581a42ace5 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
@@ -42,7 +42,7 @@ static void snd_hda_generate_beep(struct work_struct *work) | |||
42 | return; | 42 | return; |
43 | 43 | ||
44 | /* generate tone */ | 44 | /* generate tone */ |
45 | snd_hda_codec_write_cache(codec, beep->nid, 0, | 45 | snd_hda_codec_write(codec, beep->nid, 0, |
46 | AC_VERB_SET_BEEP_CONTROL, beep->tone); | 46 | AC_VERB_SET_BEEP_CONTROL, beep->tone); |
47 | } | 47 | } |
48 | 48 | ||
@@ -119,7 +119,7 @@ static void snd_hda_do_detach(struct hda_beep *beep) | |||
119 | beep->dev = NULL; | 119 | beep->dev = NULL; |
120 | cancel_work_sync(&beep->beep_work); | 120 | cancel_work_sync(&beep->beep_work); |
121 | /* turn off beep for sure */ | 121 | /* turn off beep for sure */ |
122 | snd_hda_codec_write_cache(beep->codec, beep->nid, 0, | 122 | snd_hda_codec_write(beep->codec, beep->nid, 0, |
123 | AC_VERB_SET_BEEP_CONTROL, 0); | 123 | AC_VERB_SET_BEEP_CONTROL, 0); |
124 | } | 124 | } |
125 | 125 | ||
@@ -192,7 +192,7 @@ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) | |||
192 | beep->enabled = enable; | 192 | beep->enabled = enable; |
193 | if (!enable) { | 193 | if (!enable) { |
194 | /* turn off beep */ | 194 | /* turn off beep */ |
195 | snd_hda_codec_write_cache(beep->codec, beep->nid, 0, | 195 | snd_hda_codec_write(beep->codec, beep->nid, 0, |
196 | AC_VERB_SET_BEEP_CONTROL, 0); | 196 | AC_VERB_SET_BEEP_CONTROL, 0); |
197 | } | 197 | } |
198 | if (beep->mode == HDA_BEEP_MODE_SWREG) { | 198 | if (beep->mode == HDA_BEEP_MODE_SWREG) { |
@@ -239,8 +239,12 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
239 | mutex_init(&beep->mutex); | 239 | mutex_init(&beep->mutex); |
240 | 240 | ||
241 | if (beep->mode == HDA_BEEP_MODE_ON) { | 241 | if (beep->mode == HDA_BEEP_MODE_ON) { |
242 | beep->enabled = 1; | 242 | int err = snd_hda_do_attach(beep); |
243 | snd_hda_do_register(&beep->register_work); | 243 | if (err < 0) { |
244 | kfree(beep); | ||
245 | codec->beep = NULL; | ||
246 | return err; | ||
247 | } | ||
244 | } | 248 | } |
245 | 249 | ||
246 | return 0; | 250 | return 0; |
@@ -253,7 +257,7 @@ void snd_hda_detach_beep_device(struct hda_codec *codec) | |||
253 | if (beep) { | 257 | if (beep) { |
254 | cancel_work_sync(&beep->register_work); | 258 | cancel_work_sync(&beep->register_work); |
255 | cancel_delayed_work(&beep->unregister_work); | 259 | cancel_delayed_work(&beep->unregister_work); |
256 | if (beep->enabled) | 260 | if (beep->dev) |
257 | snd_hda_do_detach(beep); | 261 | snd_hda_do_detach(beep); |
258 | codec->beep = NULL; | 262 | codec->beep = NULL; |
259 | kfree(beep); | 263 | kfree(beep); |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 950ee5cfcacf..f98b47cd6cfb 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1327,11 +1327,13 @@ EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps); | |||
1327 | */ | 1327 | */ |
1328 | u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) | 1328 | u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) |
1329 | { | 1329 | { |
1330 | u32 pincap = snd_hda_query_pin_caps(codec, nid); | 1330 | u32 pincap; |
1331 | |||
1332 | if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ | ||
1333 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
1334 | 1331 | ||
1332 | if (!codec->no_trigger_sense) { | ||
1333 | pincap = snd_hda_query_pin_caps(codec, nid); | ||
1334 | if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ | ||
1335 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
1336 | } | ||
1335 | return snd_hda_codec_read(codec, nid, 0, | 1337 | return snd_hda_codec_read(codec, nid, 0, |
1336 | AC_VERB_GET_PIN_SENSE, 0); | 1338 | AC_VERB_GET_PIN_SENSE, 0); |
1337 | } | 1339 | } |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 1d541b7f5547..0a770a28e71f 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -817,6 +817,7 @@ struct hda_codec { | |||
817 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index | 817 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index |
818 | * (e.g. Conexant codecs) | 818 | * (e.g. Conexant codecs) |
819 | */ | 819 | */ |
820 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ | ||
820 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 821 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
821 | unsigned int power_on :1; /* current (global) power-state */ | 822 | unsigned int power_on :1; /* current (global) power-state */ |
822 | unsigned int power_transition :1; /* power-state in transition */ | 823 | unsigned int power_transition :1; /* power-state in transition */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index ff8ad46cc50e..ec9c348336cc 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -356,6 +356,7 @@ struct azx_dev { | |||
356 | */ | 356 | */ |
357 | unsigned char stream_tag; /* assigned stream */ | 357 | unsigned char stream_tag; /* assigned stream */ |
358 | unsigned char index; /* stream index */ | 358 | unsigned char index; /* stream index */ |
359 | int device; /* last device number assigned to */ | ||
359 | 360 | ||
360 | unsigned int opened :1; | 361 | unsigned int opened :1; |
361 | unsigned int running :1; | 362 | unsigned int running :1; |
@@ -1441,10 +1442,13 @@ static int __devinit azx_codec_configure(struct azx *chip) | |||
1441 | */ | 1442 | */ |
1442 | 1443 | ||
1443 | /* assign a stream for the PCM */ | 1444 | /* assign a stream for the PCM */ |
1444 | static inline struct azx_dev *azx_assign_device(struct azx *chip, int stream) | 1445 | static inline struct azx_dev * |
1446 | azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream) | ||
1445 | { | 1447 | { |
1446 | int dev, i, nums; | 1448 | int dev, i, nums; |
1447 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | 1449 | struct azx_dev *res = NULL; |
1450 | |||
1451 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
1448 | dev = chip->playback_index_offset; | 1452 | dev = chip->playback_index_offset; |
1449 | nums = chip->playback_streams; | 1453 | nums = chip->playback_streams; |
1450 | } else { | 1454 | } else { |
@@ -1453,10 +1457,15 @@ static inline struct azx_dev *azx_assign_device(struct azx *chip, int stream) | |||
1453 | } | 1457 | } |
1454 | for (i = 0; i < nums; i++, dev++) | 1458 | for (i = 0; i < nums; i++, dev++) |
1455 | if (!chip->azx_dev[dev].opened) { | 1459 | if (!chip->azx_dev[dev].opened) { |
1456 | chip->azx_dev[dev].opened = 1; | 1460 | res = &chip->azx_dev[dev]; |
1457 | return &chip->azx_dev[dev]; | 1461 | if (res->device == substream->pcm->device) |
1462 | break; | ||
1458 | } | 1463 | } |
1459 | return NULL; | 1464 | if (res) { |
1465 | res->opened = 1; | ||
1466 | res->device = substream->pcm->device; | ||
1467 | } | ||
1468 | return res; | ||
1460 | } | 1469 | } |
1461 | 1470 | ||
1462 | /* release the assigned stream */ | 1471 | /* release the assigned stream */ |
@@ -1505,7 +1514,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
1505 | int err; | 1514 | int err; |
1506 | 1515 | ||
1507 | mutex_lock(&chip->open_mutex); | 1516 | mutex_lock(&chip->open_mutex); |
1508 | azx_dev = azx_assign_device(chip, substream->stream); | 1517 | azx_dev = azx_assign_device(chip, substream); |
1509 | if (azx_dev == NULL) { | 1518 | if (azx_dev == NULL) { |
1510 | mutex_unlock(&chip->open_mutex); | 1519 | mutex_unlock(&chip->open_mutex); |
1511 | return -EBUSY; | 1520 | return -EBUSY; |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 1a36137e13ec..69a941c7b158 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -1186,6 +1186,8 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1186 | */ | 1186 | */ |
1187 | spec->multiout.no_share_stream = 1; | 1187 | spec->multiout.no_share_stream = 1; |
1188 | 1188 | ||
1189 | codec->no_trigger_sense = 1; | ||
1190 | |||
1189 | return 0; | 1191 | return 0; |
1190 | } | 1192 | } |
1191 | 1193 | ||
@@ -1371,6 +1373,8 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1371 | 1373 | ||
1372 | codec->patch_ops = ad198x_patch_ops; | 1374 | codec->patch_ops = ad198x_patch_ops; |
1373 | 1375 | ||
1376 | codec->no_trigger_sense = 1; | ||
1377 | |||
1374 | return 0; | 1378 | return 0; |
1375 | } | 1379 | } |
1376 | 1380 | ||
@@ -1813,6 +1817,9 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1813 | codec->patch_ops.unsol_event = ad1981_hp_unsol_event; | 1817 | codec->patch_ops.unsol_event = ad1981_hp_unsol_event; |
1814 | break; | 1818 | break; |
1815 | } | 1819 | } |
1820 | |||
1821 | codec->no_trigger_sense = 1; | ||
1822 | |||
1816 | return 0; | 1823 | return 0; |
1817 | } | 1824 | } |
1818 | 1825 | ||
@@ -3118,6 +3125,8 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3118 | #endif | 3125 | #endif |
3119 | spec->vmaster_nid = 0x04; | 3126 | spec->vmaster_nid = 0x04; |
3120 | 3127 | ||
3128 | codec->no_trigger_sense = 1; | ||
3129 | |||
3121 | return 0; | 3130 | return 0; |
3122 | } | 3131 | } |
3123 | 3132 | ||
@@ -3330,6 +3339,8 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3330 | 3339 | ||
3331 | codec->patch_ops = ad198x_patch_ops; | 3340 | codec->patch_ops = ad198x_patch_ops; |
3332 | 3341 | ||
3342 | codec->no_trigger_sense = 1; | ||
3343 | |||
3333 | return 0; | 3344 | return 0; |
3334 | } | 3345 | } |
3335 | 3346 | ||
@@ -4287,6 +4298,8 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
4287 | break; | 4298 | break; |
4288 | } | 4299 | } |
4289 | 4300 | ||
4301 | codec->no_trigger_sense = 1; | ||
4302 | |||
4290 | return 0; | 4303 | return 0; |
4291 | } | 4304 | } |
4292 | 4305 | ||
@@ -4623,6 +4636,9 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4623 | spec->mixers[2] = ad1882_6stack_mixers; | 4636 | spec->mixers[2] = ad1882_6stack_mixers; |
4624 | break; | 4637 | break; |
4625 | } | 4638 | } |
4639 | |||
4640 | codec->no_trigger_sense = 1; | ||
4641 | |||
4626 | return 0; | 4642 | return 0; |
4627 | } | 4643 | } |
4628 | 4644 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c7465053d6bb..3f92def752fd 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1230,6 +1230,8 @@ static void alc_init_auto_mic(struct hda_codec *codec) | |||
1230 | return; /* invalid entry */ | 1230 | return; /* invalid entry */ |
1231 | } | 1231 | } |
1232 | } | 1232 | } |
1233 | if (!ext || !fixed) | ||
1234 | return; | ||
1233 | if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) | 1235 | if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) |
1234 | return; /* no unsol support */ | 1236 | return; /* no unsol support */ |
1235 | snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n", | 1237 | snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n", |
@@ -4812,6 +4814,49 @@ static void fixup_automic_adc(struct hda_codec *codec) | |||
4812 | spec->auto_mic = 0; /* disable auto-mic to be sure */ | 4814 | spec->auto_mic = 0; /* disable auto-mic to be sure */ |
4813 | } | 4815 | } |
4814 | 4816 | ||
4817 | /* choose the ADC/MUX containing the input pin and initialize the setup */ | ||
4818 | static void fixup_single_adc(struct hda_codec *codec) | ||
4819 | { | ||
4820 | struct alc_spec *spec = codec->spec; | ||
4821 | hda_nid_t pin; | ||
4822 | int i; | ||
4823 | |||
4824 | /* search for the input pin; there must be only one */ | ||
4825 | for (i = 0; i < AUTO_PIN_LAST; i++) { | ||
4826 | if (spec->autocfg.input_pins[i]) { | ||
4827 | pin = spec->autocfg.input_pins[i]; | ||
4828 | break; | ||
4829 | } | ||
4830 | } | ||
4831 | if (!pin) | ||
4832 | return; | ||
4833 | |||
4834 | /* set the default connection to that pin */ | ||
4835 | for (i = 0; i < spec->num_adc_nids; i++) { | ||
4836 | hda_nid_t cap = spec->capsrc_nids ? | ||
4837 | spec->capsrc_nids[i] : spec->adc_nids[i]; | ||
4838 | int idx; | ||
4839 | |||
4840 | idx = get_connection_index(codec, cap, pin); | ||
4841 | if (idx < 0) | ||
4842 | continue; | ||
4843 | /* use only this ADC */ | ||
4844 | if (spec->capsrc_nids) | ||
4845 | spec->capsrc_nids += i; | ||
4846 | spec->adc_nids += i; | ||
4847 | spec->num_adc_nids = 1; | ||
4848 | /* select or unmute this route */ | ||
4849 | if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) { | ||
4850 | snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx, | ||
4851 | HDA_AMP_MUTE, 0); | ||
4852 | } else { | ||
4853 | snd_hda_codec_write_cache(codec, cap, 0, | ||
4854 | AC_VERB_SET_CONNECT_SEL, idx); | ||
4855 | } | ||
4856 | return; | ||
4857 | } | ||
4858 | } | ||
4859 | |||
4815 | static void set_capture_mixer(struct hda_codec *codec) | 4860 | static void set_capture_mixer(struct hda_codec *codec) |
4816 | { | 4861 | { |
4817 | struct alc_spec *spec = codec->spec; | 4862 | struct alc_spec *spec = codec->spec; |
@@ -4824,14 +4869,15 @@ static void set_capture_mixer(struct hda_codec *codec) | |||
4824 | alc_capture_mixer3 }, | 4869 | alc_capture_mixer3 }, |
4825 | }; | 4870 | }; |
4826 | if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { | 4871 | if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { |
4827 | int mux; | 4872 | int mux = 0; |
4828 | if (spec->auto_mic) { | 4873 | if (spec->auto_mic) |
4829 | mux = 0; | ||
4830 | fixup_automic_adc(codec); | 4874 | fixup_automic_adc(codec); |
4831 | } else if (spec->input_mux && spec->input_mux->num_items > 1) | 4875 | else if (spec->input_mux) { |
4832 | mux = 1; | 4876 | if (spec->input_mux->num_items > 1) |
4833 | else | 4877 | mux = 1; |
4834 | mux = 0; | 4878 | else if (spec->input_mux->num_items == 1) |
4879 | fixup_single_adc(codec); | ||
4880 | } | ||
4835 | spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; | 4881 | spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; |
4836 | } | 4882 | } |
4837 | } | 4883 | } |
@@ -7094,8 +7140,8 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = { | |||
7094 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | 7140 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), |
7095 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | 7141 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), |
7096 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | 7142 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), |
7097 | HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | 7143 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), |
7098 | HDA_BIND_MUTE ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT), | 7144 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), |
7099 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 7145 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
7100 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 7146 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
7101 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 7147 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
@@ -7496,6 +7542,7 @@ static struct hda_verb alc885_mb5_init_verbs[] = { | |||
7496 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 7542 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
7497 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 7543 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
7498 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, | 7544 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, |
7545 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
7499 | /* Front Mic pin: input vref at 80% */ | 7546 | /* Front Mic pin: input vref at 80% */ |
7500 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 7547 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
7501 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 7548 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
@@ -7680,6 +7727,27 @@ static void alc885_mbp3_setup(struct hda_codec *codec) | |||
7680 | spec->autocfg.speaker_pins[0] = 0x14; | 7727 | spec->autocfg.speaker_pins[0] = 0x14; |
7681 | } | 7728 | } |
7682 | 7729 | ||
7730 | static void alc885_mb5_automute(struct hda_codec *codec) | ||
7731 | { | ||
7732 | unsigned int present; | ||
7733 | |||
7734 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
7735 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
7736 | snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, | ||
7737 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
7738 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
7739 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
7740 | |||
7741 | } | ||
7742 | |||
7743 | static void alc885_mb5_unsol_event(struct hda_codec *codec, | ||
7744 | unsigned int res) | ||
7745 | { | ||
7746 | /* Headphone insertion or removal. */ | ||
7747 | if ((res >> 26) == ALC880_HP_EVENT) | ||
7748 | alc885_mb5_automute(codec); | ||
7749 | } | ||
7750 | |||
7683 | static void alc885_imac91_automute(struct hda_codec *codec) | 7751 | static void alc885_imac91_automute(struct hda_codec *codec) |
7684 | { | 7752 | { |
7685 | unsigned int present; | 7753 | unsigned int present; |
@@ -9126,6 +9194,8 @@ static struct alc_config_preset alc882_presets[] = { | |||
9126 | .input_mux = &mb5_capture_source, | 9194 | .input_mux = &mb5_capture_source, |
9127 | .dig_out_nid = ALC882_DIGOUT_NID, | 9195 | .dig_out_nid = ALC882_DIGOUT_NID, |
9128 | .dig_in_nid = ALC882_DIGIN_NID, | 9196 | .dig_in_nid = ALC882_DIGIN_NID, |
9197 | .unsol_event = alc885_mb5_unsol_event, | ||
9198 | .init_hook = alc885_mb5_automute, | ||
9129 | }, | 9199 | }, |
9130 | [ALC885_MACPRO] = { | 9200 | [ALC885_MACPRO] = { |
9131 | .mixers = { alc882_macpro_mixer }, | 9201 | .mixers = { alc882_macpro_mixer }, |
@@ -11179,7 +11249,7 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, | |||
11179 | } | 11249 | } |
11180 | 11250 | ||
11181 | #define alc262_auto_create_input_ctls \ | 11251 | #define alc262_auto_create_input_ctls \ |
11182 | alc880_auto_create_input_ctls | 11252 | alc882_auto_create_input_ctls |
11183 | 11253 | ||
11184 | /* | 11254 | /* |
11185 | * generic initialization of ADC, input mixers and output mixers | 11255 | * generic initialization of ADC, input mixers and output mixers |
@@ -14855,6 +14925,8 @@ static int patch_alc861(struct hda_codec *codec) | |||
14855 | spec->stream_digital_playback = &alc861_pcm_digital_playback; | 14925 | spec->stream_digital_playback = &alc861_pcm_digital_playback; |
14856 | spec->stream_digital_capture = &alc861_pcm_digital_capture; | 14926 | spec->stream_digital_capture = &alc861_pcm_digital_capture; |
14857 | 14927 | ||
14928 | if (!spec->cap_mixer) | ||
14929 | set_capture_mixer(codec); | ||
14858 | set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); | 14930 | set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); |
14859 | 14931 | ||
14860 | spec->vmaster_nid = 0x03; | 14932 | spec->vmaster_nid = 0x03; |
@@ -15493,7 +15565,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
15493 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, | 15565 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, |
15494 | const struct auto_pin_cfg *cfg) | 15566 | const struct auto_pin_cfg *cfg) |
15495 | { | 15567 | { |
15496 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); | 15568 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x22, 0); |
15497 | } | 15569 | } |
15498 | 15570 | ||
15499 | 15571 | ||
@@ -17251,7 +17323,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
17251 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), | 17323 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), |
17252 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", | 17324 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", |
17253 | ALC662_3ST_6ch_DIG), | 17325 | ALC662_3ST_6ch_DIG), |
17254 | SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4), | 17326 | SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO), |
17255 | SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), | 17327 | SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), |
17256 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", | 17328 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", |
17257 | ALC662_3ST_6ch_DIG), | 17329 | ALC662_3ST_6ch_DIG), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index eeda7beeb57a..799ba2570902 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -4453,14 +4453,7 @@ static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) | |||
4453 | { | 4453 | { |
4454 | if (!nid) | 4454 | if (!nid) |
4455 | return 0; | 4455 | return 0; |
4456 | /* NOTE: we can't use snd_hda_jack_detect() here because STAC/IDT | 4456 | return snd_hda_jack_detect(codec, nid); |
4457 | * codecs behave wrongly when SET_PIN_SENSE is triggered, although | ||
4458 | * the pincap gives TRIG_REQ bit. | ||
4459 | */ | ||
4460 | if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0) & | ||
4461 | AC_PINSENSE_PRESENCE) | ||
4462 | return 1; | ||
4463 | return 0; | ||
4464 | } | 4457 | } |
4465 | 4458 | ||
4466 | static void stac92xx_line_out_detect(struct hda_codec *codec, | 4459 | static void stac92xx_line_out_detect(struct hda_codec *codec, |
@@ -4737,6 +4730,26 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | |||
4737 | } | 4730 | } |
4738 | } | 4731 | } |
4739 | 4732 | ||
4733 | static int hp_blike_system(u32 subsystem_id); | ||
4734 | |||
4735 | static void set_hp_led_gpio(struct hda_codec *codec) | ||
4736 | { | ||
4737 | struct sigmatel_spec *spec = codec->spec; | ||
4738 | switch (codec->vendor_id) { | ||
4739 | case 0x111d7608: | ||
4740 | /* GPIO 0 */ | ||
4741 | spec->gpio_led = 0x01; | ||
4742 | break; | ||
4743 | case 0x111d7600: | ||
4744 | case 0x111d7601: | ||
4745 | case 0x111d7602: | ||
4746 | case 0x111d7603: | ||
4747 | /* GPIO 3 */ | ||
4748 | spec->gpio_led = 0x08; | ||
4749 | break; | ||
4750 | } | ||
4751 | } | ||
4752 | |||
4740 | /* | 4753 | /* |
4741 | * This method searches for the mute LED GPIO configuration | 4754 | * This method searches for the mute LED GPIO configuration |
4742 | * provided as OEM string in SMBIOS. The format of that string | 4755 | * provided as OEM string in SMBIOS. The format of that string |
@@ -4748,6 +4761,14 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | |||
4748 | * | 4761 | * |
4749 | * So, HP B-series like systems may have HP_Mute_LED_0 (current models) | 4762 | * So, HP B-series like systems may have HP_Mute_LED_0 (current models) |
4750 | * or HP_Mute_LED_0_3 (future models) OEM SMBIOS strings | 4763 | * or HP_Mute_LED_0_3 (future models) OEM SMBIOS strings |
4764 | * | ||
4765 | * | ||
4766 | * The dv-series laptops don't seem to have the HP_Mute_LED* strings in | ||
4767 | * SMBIOS - at least the ones I have seen do not have them - which include | ||
4768 | * my own system (HP Pavilion dv6-1110ax) and my cousin's | ||
4769 | * HP Pavilion dv9500t CTO. | ||
4770 | * Need more information on whether it is true across the entire series. | ||
4771 | * -- kunal | ||
4751 | */ | 4772 | */ |
4752 | static int find_mute_led_gpio(struct hda_codec *codec) | 4773 | static int find_mute_led_gpio(struct hda_codec *codec) |
4753 | { | 4774 | { |
@@ -4758,28 +4779,27 @@ static int find_mute_led_gpio(struct hda_codec *codec) | |||
4758 | while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, | 4779 | while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, |
4759 | NULL, dev))) { | 4780 | NULL, dev))) { |
4760 | if (sscanf(dev->name, "HP_Mute_LED_%d_%d", | 4781 | if (sscanf(dev->name, "HP_Mute_LED_%d_%d", |
4761 | &spec->gpio_led_polarity, | 4782 | &spec->gpio_led_polarity, |
4762 | &spec->gpio_led) == 2) { | 4783 | &spec->gpio_led) == 2) { |
4763 | spec->gpio_led = 1 << spec->gpio_led; | 4784 | spec->gpio_led = 1 << spec->gpio_led; |
4764 | return 1; | 4785 | return 1; |
4765 | } | 4786 | } |
4766 | if (sscanf(dev->name, "HP_Mute_LED_%d", | 4787 | if (sscanf(dev->name, "HP_Mute_LED_%d", |
4767 | &spec->gpio_led_polarity) == 1) { | 4788 | &spec->gpio_led_polarity) == 1) { |
4768 | switch (codec->vendor_id) { | 4789 | set_hp_led_gpio(codec); |
4769 | case 0x111d7608: | 4790 | return 1; |
4770 | /* GPIO 0 */ | ||
4771 | spec->gpio_led = 0x01; | ||
4772 | return 1; | ||
4773 | case 0x111d7600: | ||
4774 | case 0x111d7601: | ||
4775 | case 0x111d7602: | ||
4776 | case 0x111d7603: | ||
4777 | /* GPIO 3 */ | ||
4778 | spec->gpio_led = 0x08; | ||
4779 | return 1; | ||
4780 | } | ||
4781 | } | 4791 | } |
4782 | } | 4792 | } |
4793 | |||
4794 | /* | ||
4795 | * Fallback case - if we don't find the DMI strings, | ||
4796 | * we statically set the GPIO - if not a B-series system. | ||
4797 | */ | ||
4798 | if (!hp_blike_system(codec->subsystem_id)) { | ||
4799 | set_hp_led_gpio(codec); | ||
4800 | spec->gpio_led_polarity = 1; | ||
4801 | return 1; | ||
4802 | } | ||
4783 | } | 4803 | } |
4784 | return 0; | 4804 | return 0; |
4785 | } | 4805 | } |
@@ -4962,6 +4982,7 @@ static int patch_stac9200(struct hda_codec *codec) | |||
4962 | if (spec == NULL) | 4982 | if (spec == NULL) |
4963 | return -ENOMEM; | 4983 | return -ENOMEM; |
4964 | 4984 | ||
4985 | codec->no_trigger_sense = 1; | ||
4965 | codec->spec = spec; | 4986 | codec->spec = spec; |
4966 | spec->num_pins = ARRAY_SIZE(stac9200_pin_nids); | 4987 | spec->num_pins = ARRAY_SIZE(stac9200_pin_nids); |
4967 | spec->pin_nids = stac9200_pin_nids; | 4988 | spec->pin_nids = stac9200_pin_nids; |
@@ -5024,6 +5045,7 @@ static int patch_stac925x(struct hda_codec *codec) | |||
5024 | if (spec == NULL) | 5045 | if (spec == NULL) |
5025 | return -ENOMEM; | 5046 | return -ENOMEM; |
5026 | 5047 | ||
5048 | codec->no_trigger_sense = 1; | ||
5027 | codec->spec = spec; | 5049 | codec->spec = spec; |
5028 | spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); | 5050 | spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); |
5029 | spec->pin_nids = stac925x_pin_nids; | 5051 | spec->pin_nids = stac925x_pin_nids; |
@@ -5108,6 +5130,7 @@ static int patch_stac92hd73xx(struct hda_codec *codec) | |||
5108 | if (spec == NULL) | 5130 | if (spec == NULL) |
5109 | return -ENOMEM; | 5131 | return -ENOMEM; |
5110 | 5132 | ||
5133 | codec->no_trigger_sense = 1; | ||
5111 | codec->spec = spec; | 5134 | codec->spec = spec; |
5112 | codec->slave_dig_outs = stac92hd73xx_slave_dig_outs; | 5135 | codec->slave_dig_outs = stac92hd73xx_slave_dig_outs; |
5113 | spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids); | 5136 | spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids); |
@@ -5255,6 +5278,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
5255 | if (spec == NULL) | 5278 | if (spec == NULL) |
5256 | return -ENOMEM; | 5279 | return -ENOMEM; |
5257 | 5280 | ||
5281 | codec->no_trigger_sense = 1; | ||
5258 | codec->spec = spec; | 5282 | codec->spec = spec; |
5259 | codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs; | 5283 | codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs; |
5260 | spec->digbeep_nid = 0x21; | 5284 | spec->digbeep_nid = 0x21; |
@@ -5418,6 +5442,7 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) | |||
5418 | if (spec == NULL) | 5442 | if (spec == NULL) |
5419 | return -ENOMEM; | 5443 | return -ENOMEM; |
5420 | 5444 | ||
5445 | codec->no_trigger_sense = 1; | ||
5421 | codec->spec = spec; | 5446 | codec->spec = spec; |
5422 | codec->patch_ops = stac92xx_patch_ops; | 5447 | codec->patch_ops = stac92xx_patch_ops; |
5423 | spec->num_pins = STAC92HD71BXX_NUM_PINS; | 5448 | spec->num_pins = STAC92HD71BXX_NUM_PINS; |
@@ -5550,6 +5575,8 @@ again: | |||
5550 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | 5575 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); |
5551 | spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e); | 5576 | spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e); |
5552 | 5577 | ||
5578 | snd_printdd("Found board config: %d\n", spec->board_config); | ||
5579 | |||
5553 | switch (spec->board_config) { | 5580 | switch (spec->board_config) { |
5554 | case STAC_HP_M4: | 5581 | case STAC_HP_M4: |
5555 | /* enable internal microphone */ | 5582 | /* enable internal microphone */ |
@@ -5661,6 +5688,7 @@ static int patch_stac922x(struct hda_codec *codec) | |||
5661 | if (spec == NULL) | 5688 | if (spec == NULL) |
5662 | return -ENOMEM; | 5689 | return -ENOMEM; |
5663 | 5690 | ||
5691 | codec->no_trigger_sense = 1; | ||
5664 | codec->spec = spec; | 5692 | codec->spec = spec; |
5665 | spec->num_pins = ARRAY_SIZE(stac922x_pin_nids); | 5693 | spec->num_pins = ARRAY_SIZE(stac922x_pin_nids); |
5666 | spec->pin_nids = stac922x_pin_nids; | 5694 | spec->pin_nids = stac922x_pin_nids; |
@@ -5764,6 +5792,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5764 | if (spec == NULL) | 5792 | if (spec == NULL) |
5765 | return -ENOMEM; | 5793 | return -ENOMEM; |
5766 | 5794 | ||
5795 | codec->no_trigger_sense = 1; | ||
5767 | codec->spec = spec; | 5796 | codec->spec = spec; |
5768 | codec->slave_dig_outs = stac927x_slave_dig_outs; | 5797 | codec->slave_dig_outs = stac927x_slave_dig_outs; |
5769 | spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); | 5798 | spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); |
@@ -5898,6 +5927,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
5898 | if (spec == NULL) | 5927 | if (spec == NULL) |
5899 | return -ENOMEM; | 5928 | return -ENOMEM; |
5900 | 5929 | ||
5930 | codec->no_trigger_sense = 1; | ||
5901 | codec->spec = spec; | 5931 | codec->spec = spec; |
5902 | spec->num_pins = ARRAY_SIZE(stac9205_pin_nids); | 5932 | spec->num_pins = ARRAY_SIZE(stac9205_pin_nids); |
5903 | spec->pin_nids = stac9205_pin_nids; | 5933 | spec->pin_nids = stac9205_pin_nids; |
@@ -6053,6 +6083,7 @@ static int patch_stac9872(struct hda_codec *codec) | |||
6053 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 6083 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
6054 | if (spec == NULL) | 6084 | if (spec == NULL) |
6055 | return -ENOMEM; | 6085 | return -ENOMEM; |
6086 | codec->no_trigger_sense = 1; | ||
6056 | codec->spec = spec; | 6087 | codec->spec = spec; |
6057 | spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); | 6088 | spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); |
6058 | spec->pin_nids = stac9872_pin_nids; | 6089 | spec->pin_nids = stac9872_pin_nids; |
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index b5ca02e2038c..e66ef2b69b5d 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c | |||
@@ -1058,7 +1058,7 @@ setsamplerate(struct cmdif *cif, unsigned char *intdec, unsigned int rate) | |||
1058 | rptr.retwords[2] != M && | 1058 | rptr.retwords[2] != M && |
1059 | rptr.retwords[3] != N && | 1059 | rptr.retwords[3] != N && |
1060 | i++ < MAX_WRITE_RETRY); | 1060 | i++ < MAX_WRITE_RETRY); |
1061 | if (i == MAX_WRITE_RETRY) { | 1061 | if (i > MAX_WRITE_RETRY) { |
1062 | snd_printdd("sent samplerate %d: %d failed\n", | 1062 | snd_printdd("sent samplerate %d: %d failed\n", |
1063 | *intdec, rate); | 1063 | *intdec, rate); |
1064 | return -EIO; | 1064 | return -EIO; |
diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c index 69bd0acc81c8..a1bbe16b7f96 100644 --- a/sound/soc/codecs/ac97.c +++ b/sound/soc/codecs/ac97.c | |||
@@ -102,6 +102,12 @@ static int ac97_soc_probe(struct platform_device *pdev) | |||
102 | INIT_LIST_HEAD(&codec->dapm_widgets); | 102 | INIT_LIST_HEAD(&codec->dapm_widgets); |
103 | INIT_LIST_HEAD(&codec->dapm_paths); | 103 | INIT_LIST_HEAD(&codec->dapm_paths); |
104 | 104 | ||
105 | ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||
106 | if (ret < 0) { | ||
107 | printk(KERN_ERR "ASoC: failed to init gen ac97 glue\n"); | ||
108 | goto err; | ||
109 | } | ||
110 | |||
105 | /* register pcms */ | 111 | /* register pcms */ |
106 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 112 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); |
107 | if (ret < 0) | 113 | if (ret < 0) |
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index ebbf11b653a4..718ef912e758 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c | |||
@@ -925,7 +925,7 @@ static int wm8350_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
925 | iface |= 0x3 << 8; | 925 | iface |= 0x3 << 8; |
926 | break; | 926 | break; |
927 | case SND_SOC_DAIFMT_DSP_B: | 927 | case SND_SOC_DAIFMT_DSP_B: |
928 | iface |= 0x3 << 8; /* lg not sure which mode */ | 928 | iface |= 0x3 << 8 | WM8350_AIF_LRCLK_INV; |
929 | break; | 929 | break; |
930 | default: | 930 | default: |
931 | return -EINVAL; | 931 | return -EINVAL; |
diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index 265e68c75df8..af8cb6995a1f 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c | |||
@@ -424,23 +424,23 @@ static int wm8510_pcm_hw_params(struct snd_pcm_substream *substream, | |||
424 | 424 | ||
425 | /* filter coefficient */ | 425 | /* filter coefficient */ |
426 | switch (params_rate(params)) { | 426 | switch (params_rate(params)) { |
427 | case SNDRV_PCM_RATE_8000: | 427 | case 8000: |
428 | adn |= 0x5 << 1; | 428 | adn |= 0x5 << 1; |
429 | break; | 429 | break; |
430 | case SNDRV_PCM_RATE_11025: | 430 | case 11025: |
431 | adn |= 0x4 << 1; | 431 | adn |= 0x4 << 1; |
432 | break; | 432 | break; |
433 | case SNDRV_PCM_RATE_16000: | 433 | case 16000: |
434 | adn |= 0x3 << 1; | 434 | adn |= 0x3 << 1; |
435 | break; | 435 | break; |
436 | case SNDRV_PCM_RATE_22050: | 436 | case 22050: |
437 | adn |= 0x2 << 1; | 437 | adn |= 0x2 << 1; |
438 | break; | 438 | break; |
439 | case SNDRV_PCM_RATE_32000: | 439 | case 32000: |
440 | adn |= 0x1 << 1; | 440 | adn |= 0x1 << 1; |
441 | break; | 441 | break; |
442 | case SNDRV_PCM_RATE_44100: | 442 | case 44100: |
443 | case SNDRV_PCM_RATE_48000: | 443 | case 48000: |
444 | break; | 444 | break; |
445 | } | 445 | } |
446 | 446 | ||
diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index 3d850b97037a..31e39ffd1d8e 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c | |||
@@ -378,23 +378,23 @@ static int wm8940_i2s_hw_params(struct snd_pcm_substream *substream, | |||
378 | iface |= (1 << 9); | 378 | iface |= (1 << 9); |
379 | 379 | ||
380 | switch (params_rate(params)) { | 380 | switch (params_rate(params)) { |
381 | case SNDRV_PCM_RATE_8000: | 381 | case 8000: |
382 | addcntrl |= (0x5 << 1); | 382 | addcntrl |= (0x5 << 1); |
383 | break; | 383 | break; |
384 | case SNDRV_PCM_RATE_11025: | 384 | case 11025: |
385 | addcntrl |= (0x4 << 1); | 385 | addcntrl |= (0x4 << 1); |
386 | break; | 386 | break; |
387 | case SNDRV_PCM_RATE_16000: | 387 | case 16000: |
388 | addcntrl |= (0x3 << 1); | 388 | addcntrl |= (0x3 << 1); |
389 | break; | 389 | break; |
390 | case SNDRV_PCM_RATE_22050: | 390 | case 22050: |
391 | addcntrl |= (0x2 << 1); | 391 | addcntrl |= (0x2 << 1); |
392 | break; | 392 | break; |
393 | case SNDRV_PCM_RATE_32000: | 393 | case 32000: |
394 | addcntrl |= (0x1 << 1); | 394 | addcntrl |= (0x1 << 1); |
395 | break; | 395 | break; |
396 | case SNDRV_PCM_RATE_44100: | 396 | case 44100: |
397 | case SNDRV_PCM_RATE_48000: | 397 | case 48000: |
398 | break; | 398 | break; |
399 | } | 399 | } |
400 | ret = snd_soc_write(codec, WM8940_ADDCNTRL, addcntrl); | 400 | ret = snd_soc_write(codec, WM8940_ADDCNTRL, addcntrl); |
diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index a808675388fc..8812751da8c9 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c | |||
@@ -482,23 +482,23 @@ static int wm8974_pcm_hw_params(struct snd_pcm_substream *substream, | |||
482 | 482 | ||
483 | /* filter coefficient */ | 483 | /* filter coefficient */ |
484 | switch (params_rate(params)) { | 484 | switch (params_rate(params)) { |
485 | case SNDRV_PCM_RATE_8000: | 485 | case 8000: |
486 | adn |= 0x5 << 1; | 486 | adn |= 0x5 << 1; |
487 | break; | 487 | break; |
488 | case SNDRV_PCM_RATE_11025: | 488 | case 11025: |
489 | adn |= 0x4 << 1; | 489 | adn |= 0x4 << 1; |
490 | break; | 490 | break; |
491 | case SNDRV_PCM_RATE_16000: | 491 | case 16000: |
492 | adn |= 0x3 << 1; | 492 | adn |= 0x3 << 1; |
493 | break; | 493 | break; |
494 | case SNDRV_PCM_RATE_22050: | 494 | case 22050: |
495 | adn |= 0x2 << 1; | 495 | adn |= 0x2 << 1; |
496 | break; | 496 | break; |
497 | case SNDRV_PCM_RATE_32000: | 497 | case 32000: |
498 | adn |= 0x1 << 1; | 498 | adn |= 0x1 << 1; |
499 | break; | 499 | break; |
500 | case SNDRV_PCM_RATE_44100: | 500 | case 44100: |
501 | case SNDRV_PCM_RATE_48000: | 501 | case 48000: |
502 | break; | 502 | break; |
503 | } | 503 | } |
504 | 504 | ||
diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index c7af09729c6e..5263ab18f827 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c | |||
@@ -42,42 +42,12 @@ static struct snd_soc_device fsi_snd_devdata = { | |||
42 | .codec_dev = &soc_codec_dev_ak4642, | 42 | .codec_dev = &soc_codec_dev_ak4642, |
43 | }; | 43 | }; |
44 | 44 | ||
45 | #define AK4642_BUS 0 | ||
46 | #define AK4642_ADR 0x12 | ||
47 | static int ak4642_add_i2c_device(void) | ||
48 | { | ||
49 | struct i2c_board_info info; | ||
50 | struct i2c_adapter *adapter; | ||
51 | struct i2c_client *client; | ||
52 | |||
53 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
54 | info.addr = AK4642_ADR; | ||
55 | strlcpy(info.type, "ak4642", I2C_NAME_SIZE); | ||
56 | |||
57 | adapter = i2c_get_adapter(AK4642_BUS); | ||
58 | if (!adapter) { | ||
59 | printk(KERN_DEBUG "can't get i2c adapter\n"); | ||
60 | return -ENODEV; | ||
61 | } | ||
62 | |||
63 | client = i2c_new_device(adapter, &info); | ||
64 | i2c_put_adapter(adapter); | ||
65 | if (!client) { | ||
66 | printk(KERN_DEBUG "can't add i2c device\n"); | ||
67 | return -ENODEV; | ||
68 | } | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static struct platform_device *fsi_snd_device; | 45 | static struct platform_device *fsi_snd_device; |
74 | 46 | ||
75 | static int __init fsi_ak4642_init(void) | 47 | static int __init fsi_ak4642_init(void) |
76 | { | 48 | { |
77 | int ret = -ENOMEM; | 49 | int ret = -ENOMEM; |
78 | 50 | ||
79 | ak4642_add_i2c_device(); | ||
80 | |||
81 | fsi_snd_device = platform_device_alloc("soc-audio", -1); | 51 | fsi_snd_device = platform_device_alloc("soc-audio", -1); |
82 | if (!fsi_snd_device) | 52 | if (!fsi_snd_device) |
83 | goto out; | 53 | goto out; |
diff --git a/sound/sound_core.c b/sound/sound_core.c index dbca7c909a31..7c2d677a2df5 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c | |||
@@ -61,7 +61,7 @@ static void __exit cleanup_soundcore(void) | |||
61 | class_destroy(sound_class); | 61 | class_destroy(sound_class); |
62 | } | 62 | } |
63 | 63 | ||
64 | module_init(init_soundcore); | 64 | subsys_initcall(init_soundcore); |
65 | module_exit(cleanup_soundcore); | 65 | module_exit(cleanup_soundcore); |
66 | 66 | ||
67 | 67 | ||
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 4963defee18a..9edef4684978 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -1936,7 +1936,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction) | |||
1936 | struct snd_usb_stream *as = snd_pcm_substream_chip(substream); | 1936 | struct snd_usb_stream *as = snd_pcm_substream_chip(substream); |
1937 | struct snd_usb_substream *subs = &as->substream[direction]; | 1937 | struct snd_usb_substream *subs = &as->substream[direction]; |
1938 | 1938 | ||
1939 | if (subs->interface >= 0) { | 1939 | if (!as->chip->shutdown && subs->interface >= 0) { |
1940 | usb_set_interface(subs->dev, subs->interface, 0); | 1940 | usb_set_interface(subs->dev, subs->interface, 0); |
1941 | subs->interface = -1; | 1941 | subs->interface = -1; |
1942 | } | 1942 | } |