diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/isa/sb/emu8000_patch.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/hda_jack.c | 24 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0132.c | 33 | ||||
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 6 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 87 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 4 | ||||
-rw-r--r-- | sound/pci/hda/patch_via.c | 287 | ||||
-rw-r--r-- | sound/pci/intel8x0.c | 6 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 25 | ||||
-rw-r--r-- | sound/soc/codecs/cs42l73.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm5100.c | 12 | ||||
-rw-r--r-- | sound/soc/codecs/wm8962.c | 8 | ||||
-rw-r--r-- | sound/soc/codecs/wm8994.c | 16 | ||||
-rw-r--r-- | sound/soc/codecs/wm8996.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm_hubs.c | 18 | ||||
-rw-r--r-- | sound/soc/samsung/neo1973_wm8753.c | 65 | ||||
-rw-r--r-- | sound/soc/sh/fsi.c | 6 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 11 | ||||
-rw-r--r-- | sound/usb/quirks-table.h | 8 |
20 files changed, 317 insertions, 306 deletions
diff --git a/sound/isa/sb/emu8000_patch.c b/sound/isa/sb/emu8000_patch.c index e09f144177f5..c99c6078be33 100644 --- a/sound/isa/sb/emu8000_patch.c +++ b/sound/isa/sb/emu8000_patch.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include "emu8000_local.h" | 22 | #include "emu8000_local.h" |
23 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
24 | #include <linux/moduleparam.h> | 24 | #include <linux/moduleparam.h> |
25 | #include <linux/moduleparam.h> | ||
26 | 25 | ||
27 | static int emu8000_reset_addr; | 26 | static int emu8000_reset_addr; |
28 | module_param(emu8000_reset_addr, int, 0444); | 27 | module_param(emu8000_reset_addr, int, 0444); |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 4df72c0e8c37..c2c65f63bf06 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1447,7 +1447,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1447 | for (i = 0; i < c->cvt_setups.used; i++) { | 1447 | for (i = 0; i < c->cvt_setups.used; i++) { |
1448 | p = snd_array_elem(&c->cvt_setups, i); | 1448 | p = snd_array_elem(&c->cvt_setups, i); |
1449 | if (!p->active && p->stream_tag == stream_tag && | 1449 | if (!p->active && p->stream_tag == stream_tag && |
1450 | get_wcaps_type(get_wcaps(codec, p->nid)) == type) | 1450 | get_wcaps_type(get_wcaps(c, p->nid)) == type) |
1451 | p->dirty = 1; | 1451 | p->dirty = 1; |
1452 | } | 1452 | } |
1453 | } | 1453 | } |
diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c index d8a35da0803f..9d819c4b4923 100644 --- a/sound/pci/hda/hda_jack.c +++ b/sound/pci/hda/hda_jack.c | |||
@@ -282,7 +282,8 @@ int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, | |||
282 | EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl); | 282 | EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl); |
283 | 283 | ||
284 | static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, | 284 | static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, |
285 | const struct auto_pin_cfg *cfg) | 285 | const struct auto_pin_cfg *cfg, |
286 | char *lastname, int *lastidx) | ||
286 | { | 287 | { |
287 | unsigned int def_conf, conn; | 288 | unsigned int def_conf, conn; |
288 | char name[44]; | 289 | char name[44]; |
@@ -298,6 +299,10 @@ static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, | |||
298 | return 0; | 299 | return 0; |
299 | 300 | ||
300 | snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx); | 301 | snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx); |
302 | if (!strcmp(name, lastname) && idx == *lastidx) | ||
303 | idx++; | ||
304 | strncpy(lastname, name, 44); | ||
305 | *lastidx = idx; | ||
301 | err = snd_hda_jack_add_kctl(codec, nid, name, idx); | 306 | err = snd_hda_jack_add_kctl(codec, nid, name, idx); |
302 | if (err < 0) | 307 | if (err < 0) |
303 | return err; | 308 | return err; |
@@ -311,41 +316,42 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec, | |||
311 | const struct auto_pin_cfg *cfg) | 316 | const struct auto_pin_cfg *cfg) |
312 | { | 317 | { |
313 | const hda_nid_t *p; | 318 | const hda_nid_t *p; |
314 | int i, err; | 319 | int i, err, lastidx = 0; |
320 | char lastname[44] = ""; | ||
315 | 321 | ||
316 | for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) { | 322 | for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) { |
317 | err = add_jack_kctl(codec, *p, cfg); | 323 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
318 | if (err < 0) | 324 | if (err < 0) |
319 | return err; | 325 | return err; |
320 | } | 326 | } |
321 | for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) { | 327 | for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) { |
322 | if (*p == *cfg->line_out_pins) /* might be duplicated */ | 328 | if (*p == *cfg->line_out_pins) /* might be duplicated */ |
323 | break; | 329 | break; |
324 | err = add_jack_kctl(codec, *p, cfg); | 330 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
325 | if (err < 0) | 331 | if (err < 0) |
326 | return err; | 332 | return err; |
327 | } | 333 | } |
328 | for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) { | 334 | for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) { |
329 | if (*p == *cfg->line_out_pins) /* might be duplicated */ | 335 | if (*p == *cfg->line_out_pins) /* might be duplicated */ |
330 | break; | 336 | break; |
331 | err = add_jack_kctl(codec, *p, cfg); | 337 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
332 | if (err < 0) | 338 | if (err < 0) |
333 | return err; | 339 | return err; |
334 | } | 340 | } |
335 | for (i = 0; i < cfg->num_inputs; i++) { | 341 | for (i = 0; i < cfg->num_inputs; i++) { |
336 | err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg); | 342 | err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg, lastname, &lastidx); |
337 | if (err < 0) | 343 | if (err < 0) |
338 | return err; | 344 | return err; |
339 | } | 345 | } |
340 | for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) { | 346 | for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) { |
341 | err = add_jack_kctl(codec, *p, cfg); | 347 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
342 | if (err < 0) | 348 | if (err < 0) |
343 | return err; | 349 | return err; |
344 | } | 350 | } |
345 | err = add_jack_kctl(codec, cfg->dig_in_pin, cfg); | 351 | err = add_jack_kctl(codec, cfg->dig_in_pin, cfg, lastname, &lastidx); |
346 | if (err < 0) | 352 | if (err < 0) |
347 | return err; | 353 | return err; |
348 | err = add_jack_kctl(codec, cfg->mono_out_pin, cfg); | 354 | err = add_jack_kctl(codec, cfg->mono_out_pin, cfg, lastname, &lastidx); |
349 | if (err < 0) | 355 | if (err < 0) |
350 | return err; | 356 | return err; |
351 | return 0; | 357 | return 0; |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 35abe3c62908..21d91d580da8 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
@@ -728,18 +728,19 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol, | |||
728 | 728 | ||
729 | err = chipio_read(codec, REG_CODEC_MUTE, &data); | 729 | err = chipio_read(codec, REG_CODEC_MUTE, &data); |
730 | if (err < 0) | 730 | if (err < 0) |
731 | return err; | 731 | goto exit; |
732 | 732 | ||
733 | /* *valp 0 is mute, 1 is unmute */ | 733 | /* *valp 0 is mute, 1 is unmute */ |
734 | data = (data & 0x7f) | (*valp ? 0 : 0x80); | 734 | data = (data & 0x7f) | (*valp ? 0 : 0x80); |
735 | chipio_write(codec, REG_CODEC_MUTE, data); | 735 | err = chipio_write(codec, REG_CODEC_MUTE, data); |
736 | if (err < 0) | 736 | if (err < 0) |
737 | return err; | 737 | goto exit; |
738 | 738 | ||
739 | spec->curr_hp_switch = *valp; | 739 | spec->curr_hp_switch = *valp; |
740 | 740 | ||
741 | exit: | ||
741 | snd_hda_power_down(codec); | 742 | snd_hda_power_down(codec); |
742 | return 1; | 743 | return err < 0 ? err : 1; |
743 | } | 744 | } |
744 | 745 | ||
745 | static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol, | 746 | static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol, |
@@ -770,18 +771,19 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol, | |||
770 | 771 | ||
771 | err = chipio_read(codec, REG_CODEC_MUTE, &data); | 772 | err = chipio_read(codec, REG_CODEC_MUTE, &data); |
772 | if (err < 0) | 773 | if (err < 0) |
773 | return err; | 774 | goto exit; |
774 | 775 | ||
775 | /* *valp 0 is mute, 1 is unmute */ | 776 | /* *valp 0 is mute, 1 is unmute */ |
776 | data = (data & 0xef) | (*valp ? 0 : 0x10); | 777 | data = (data & 0xef) | (*valp ? 0 : 0x10); |
777 | chipio_write(codec, REG_CODEC_MUTE, data); | 778 | err = chipio_write(codec, REG_CODEC_MUTE, data); |
778 | if (err < 0) | 779 | if (err < 0) |
779 | return err; | 780 | goto exit; |
780 | 781 | ||
781 | spec->curr_speaker_switch = *valp; | 782 | spec->curr_speaker_switch = *valp; |
782 | 783 | ||
784 | exit: | ||
783 | snd_hda_power_down(codec); | 785 | snd_hda_power_down(codec); |
784 | return 1; | 786 | return err < 0 ? err : 1; |
785 | } | 787 | } |
786 | 788 | ||
787 | static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol, | 789 | static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol, |
@@ -819,25 +821,26 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol, | |||
819 | 821 | ||
820 | err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data); | 822 | err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data); |
821 | if (err < 0) | 823 | if (err < 0) |
822 | return err; | 824 | goto exit; |
823 | 825 | ||
824 | val = 31 - left_vol; | 826 | val = 31 - left_vol; |
825 | data = (data & 0xe0) | val; | 827 | data = (data & 0xe0) | val; |
826 | chipio_write(codec, REG_CODEC_HP_VOL_L, data); | 828 | err = chipio_write(codec, REG_CODEC_HP_VOL_L, data); |
827 | if (err < 0) | 829 | if (err < 0) |
828 | return err; | 830 | goto exit; |
829 | 831 | ||
830 | val = 31 - right_vol; | 832 | val = 31 - right_vol; |
831 | data = (data & 0xe0) | val; | 833 | data = (data & 0xe0) | val; |
832 | chipio_write(codec, REG_CODEC_HP_VOL_R, data); | 834 | err = chipio_write(codec, REG_CODEC_HP_VOL_R, data); |
833 | if (err < 0) | 835 | if (err < 0) |
834 | return err; | 836 | goto exit; |
835 | 837 | ||
836 | spec->curr_hp_volume[0] = left_vol; | 838 | spec->curr_hp_volume[0] = left_vol; |
837 | spec->curr_hp_volume[1] = right_vol; | 839 | spec->curr_hp_volume[1] = right_vol; |
838 | 840 | ||
841 | exit: | ||
839 | snd_hda_power_down(codec); | 842 | snd_hda_power_down(codec); |
840 | return 1; | 843 | return err < 0 ? err : 1; |
841 | } | 844 | } |
842 | 845 | ||
843 | static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid) | 846 | static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid) |
@@ -936,6 +939,8 @@ static int ca0132_build_controls(struct hda_codec *codec) | |||
936 | if (err < 0) | 939 | if (err < 0) |
937 | return err; | 940 | return err; |
938 | err = add_in_volume(codec, spec->dig_in, "IEC958"); | 941 | err = add_in_volume(codec, spec->dig_in, "IEC958"); |
942 | if (err < 0) | ||
943 | return err; | ||
939 | } | 944 | } |
940 | return 0; | 945 | return 0; |
941 | } | 946 | } |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 0e99357e822c..bc5a993d1146 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -988,8 +988,10 @@ static void cs_automic(struct hda_codec *codec) | |||
988 | change_cur_input(codec, !spec->automic_idx, 0); | 988 | change_cur_input(codec, !spec->automic_idx, 0); |
989 | } else { | 989 | } else { |
990 | if (present) { | 990 | if (present) { |
991 | spec->last_input = spec->cur_input; | 991 | if (spec->cur_input != spec->automic_idx) { |
992 | spec->cur_input = spec->automic_idx; | 992 | spec->last_input = spec->cur_input; |
993 | spec->cur_input = spec->automic_idx; | ||
994 | } | ||
993 | } else { | 995 | } else { |
994 | spec->cur_input = spec->last_input; | 996 | spec->cur_input = spec->last_input; |
995 | } | 997 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0db1dc49382b..1358987c49d8 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -177,6 +177,7 @@ struct alc_spec { | |||
177 | unsigned int detect_lo:1; /* Line-out detection enabled */ | 177 | unsigned int detect_lo:1; /* Line-out detection enabled */ |
178 | unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ | 178 | unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ |
179 | unsigned int automute_lo_possible:1; /* there are line outs and HP */ | 179 | unsigned int automute_lo_possible:1; /* there are line outs and HP */ |
180 | unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */ | ||
180 | 181 | ||
181 | /* other flags */ | 182 | /* other flags */ |
182 | unsigned int no_analog :1; /* digital I/O only */ | 183 | unsigned int no_analog :1; /* digital I/O only */ |
@@ -495,13 +496,24 @@ static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins, | |||
495 | 496 | ||
496 | for (i = 0; i < num_pins; i++) { | 497 | for (i = 0; i < num_pins; i++) { |
497 | hda_nid_t nid = pins[i]; | 498 | hda_nid_t nid = pins[i]; |
499 | unsigned int val; | ||
498 | if (!nid) | 500 | if (!nid) |
499 | break; | 501 | break; |
500 | switch (spec->automute_mode) { | 502 | switch (spec->automute_mode) { |
501 | case ALC_AUTOMUTE_PIN: | 503 | case ALC_AUTOMUTE_PIN: |
504 | /* don't reset VREF value in case it's controlling | ||
505 | * the amp (see alc861_fixup_asus_amp_vref_0f()) | ||
506 | */ | ||
507 | if (spec->keep_vref_in_automute) { | ||
508 | val = snd_hda_codec_read(codec, nid, 0, | ||
509 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
510 | val &= ~PIN_HP; | ||
511 | } else | ||
512 | val = 0; | ||
513 | val |= pin_bits; | ||
502 | snd_hda_codec_write(codec, nid, 0, | 514 | snd_hda_codec_write(codec, nid, 0, |
503 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 515 | AC_VERB_SET_PIN_WIDGET_CONTROL, |
504 | pin_bits); | 516 | val); |
505 | break; | 517 | break; |
506 | case ALC_AUTOMUTE_AMP: | 518 | case ALC_AUTOMUTE_AMP: |
507 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, | 519 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, |
@@ -1843,6 +1855,8 @@ static const char * const alc_slave_vols[] = { | |||
1843 | "Speaker Playback Volume", | 1855 | "Speaker Playback Volume", |
1844 | "Mono Playback Volume", | 1856 | "Mono Playback Volume", |
1845 | "Line-Out Playback Volume", | 1857 | "Line-Out Playback Volume", |
1858 | "CLFE Playback Volume", | ||
1859 | "Bass Speaker Playback Volume", | ||
1846 | "PCM Playback Volume", | 1860 | "PCM Playback Volume", |
1847 | NULL, | 1861 | NULL, |
1848 | }; | 1862 | }; |
@@ -1858,6 +1872,8 @@ static const char * const alc_slave_sws[] = { | |||
1858 | "Mono Playback Switch", | 1872 | "Mono Playback Switch", |
1859 | "IEC958 Playback Switch", | 1873 | "IEC958 Playback Switch", |
1860 | "Line-Out Playback Switch", | 1874 | "Line-Out Playback Switch", |
1875 | "CLFE Playback Switch", | ||
1876 | "Bass Speaker Playback Switch", | ||
1861 | "PCM Playback Switch", | 1877 | "PCM Playback Switch", |
1862 | NULL, | 1878 | NULL, |
1863 | }; | 1879 | }; |
@@ -2306,7 +2322,7 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
2306 | "%s Analog", codec->chip_name); | 2322 | "%s Analog", codec->chip_name); |
2307 | info->name = spec->stream_name_analog; | 2323 | info->name = spec->stream_name_analog; |
2308 | 2324 | ||
2309 | if (spec->multiout.dac_nids > 0) { | 2325 | if (spec->multiout.num_dacs > 0) { |
2310 | p = spec->stream_analog_playback; | 2326 | p = spec->stream_analog_playback; |
2311 | if (!p) | 2327 | if (!p) |
2312 | p = &alc_pcm_analog_playback; | 2328 | p = &alc_pcm_analog_playback; |
@@ -4358,6 +4374,7 @@ enum { | |||
4358 | ALC882_FIXUP_ACER_ASPIRE_8930G, | 4374 | ALC882_FIXUP_ACER_ASPIRE_8930G, |
4359 | ALC882_FIXUP_ASPIRE_8930G_VERBS, | 4375 | ALC882_FIXUP_ASPIRE_8930G_VERBS, |
4360 | ALC885_FIXUP_MACPRO_GPIO, | 4376 | ALC885_FIXUP_MACPRO_GPIO, |
4377 | ALC889_FIXUP_DAC_ROUTE, | ||
4361 | }; | 4378 | }; |
4362 | 4379 | ||
4363 | static void alc889_fixup_coef(struct hda_codec *codec, | 4380 | static void alc889_fixup_coef(struct hda_codec *codec, |
@@ -4411,6 +4428,23 @@ static void alc885_fixup_macpro_gpio(struct hda_codec *codec, | |||
4411 | alc882_gpio_mute(codec, 1, 0); | 4428 | alc882_gpio_mute(codec, 1, 0); |
4412 | } | 4429 | } |
4413 | 4430 | ||
4431 | /* Fix the connection of some pins for ALC889: | ||
4432 | * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't | ||
4433 | * work correctly (bko#42740) | ||
4434 | */ | ||
4435 | static void alc889_fixup_dac_route(struct hda_codec *codec, | ||
4436 | const struct alc_fixup *fix, int action) | ||
4437 | { | ||
4438 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { | ||
4439 | hda_nid_t conn1[2] = { 0x0c, 0x0d }; | ||
4440 | hda_nid_t conn2[2] = { 0x0e, 0x0f }; | ||
4441 | snd_hda_override_conn_list(codec, 0x14, 2, conn1); | ||
4442 | snd_hda_override_conn_list(codec, 0x15, 2, conn1); | ||
4443 | snd_hda_override_conn_list(codec, 0x18, 2, conn2); | ||
4444 | snd_hda_override_conn_list(codec, 0x1a, 2, conn2); | ||
4445 | } | ||
4446 | } | ||
4447 | |||
4414 | static const struct alc_fixup alc882_fixups[] = { | 4448 | static const struct alc_fixup alc882_fixups[] = { |
4415 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { | 4449 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { |
4416 | .type = ALC_FIXUP_PINS, | 4450 | .type = ALC_FIXUP_PINS, |
@@ -4558,6 +4592,10 @@ static const struct alc_fixup alc882_fixups[] = { | |||
4558 | .type = ALC_FIXUP_FUNC, | 4592 | .type = ALC_FIXUP_FUNC, |
4559 | .v.func = alc885_fixup_macpro_gpio, | 4593 | .v.func = alc885_fixup_macpro_gpio, |
4560 | }, | 4594 | }, |
4595 | [ALC889_FIXUP_DAC_ROUTE] = { | ||
4596 | .type = ALC_FIXUP_FUNC, | ||
4597 | .v.func = alc889_fixup_dac_route, | ||
4598 | }, | ||
4561 | }; | 4599 | }; |
4562 | 4600 | ||
4563 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { | 4601 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
@@ -4582,6 +4620,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
4582 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | 4620 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", |
4583 | ALC882_FIXUP_ACER_ASPIRE_4930G), | 4621 | ALC882_FIXUP_ACER_ASPIRE_4930G), |
4584 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | 4622 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), |
4623 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), | ||
4585 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | 4624 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), |
4586 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | 4625 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), |
4587 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), | 4626 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), |
@@ -4735,7 +4774,6 @@ enum { | |||
4735 | ALC262_FIXUP_FSC_H270, | 4774 | ALC262_FIXUP_FSC_H270, |
4736 | ALC262_FIXUP_HP_Z200, | 4775 | ALC262_FIXUP_HP_Z200, |
4737 | ALC262_FIXUP_TYAN, | 4776 | ALC262_FIXUP_TYAN, |
4738 | ALC262_FIXUP_TOSHIBA_RX1, | ||
4739 | ALC262_FIXUP_LENOVO_3000, | 4777 | ALC262_FIXUP_LENOVO_3000, |
4740 | ALC262_FIXUP_BENQ, | 4778 | ALC262_FIXUP_BENQ, |
4741 | ALC262_FIXUP_BENQ_T31, | 4779 | ALC262_FIXUP_BENQ_T31, |
@@ -4765,16 +4803,6 @@ static const struct alc_fixup alc262_fixups[] = { | |||
4765 | { } | 4803 | { } |
4766 | } | 4804 | } |
4767 | }, | 4805 | }, |
4768 | [ALC262_FIXUP_TOSHIBA_RX1] = { | ||
4769 | .type = ALC_FIXUP_PINS, | ||
4770 | .v.pins = (const struct alc_pincfg[]) { | ||
4771 | { 0x14, 0x90170110 }, /* speaker */ | ||
4772 | { 0x15, 0x0421101f }, /* HP */ | ||
4773 | { 0x1a, 0x40f000f0 }, /* N/A */ | ||
4774 | { 0x1b, 0x40f000f0 }, /* N/A */ | ||
4775 | { 0x1e, 0x40f000f0 }, /* N/A */ | ||
4776 | } | ||
4777 | }, | ||
4778 | [ALC262_FIXUP_LENOVO_3000] = { | 4806 | [ALC262_FIXUP_LENOVO_3000] = { |
4779 | .type = ALC_FIXUP_VERBS, | 4807 | .type = ALC_FIXUP_VERBS, |
4780 | .v.verbs = (const struct hda_verb[]) { | 4808 | .v.verbs = (const struct hda_verb[]) { |
@@ -4807,8 +4835,6 @@ static const struct snd_pci_quirk alc262_fixup_tbl[] = { | |||
4807 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ), | 4835 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ), |
4808 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), | 4836 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), |
4809 | SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), | 4837 | SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), |
4810 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", | ||
4811 | ALC262_FIXUP_TOSHIBA_RX1), | ||
4812 | SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), | 4838 | SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), |
4813 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), | 4839 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), |
4814 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), | 4840 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), |
@@ -5377,7 +5403,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5377 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 5403 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
5378 | ALC269_FIXUP_AMIC), | 5404 | ALC269_FIXUP_AMIC), |
5379 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), | 5405 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), |
5380 | SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269_FIXUP_AMIC), | ||
5381 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), | 5406 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), |
5382 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), | 5407 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), |
5383 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), | 5408 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), |
@@ -5589,6 +5614,25 @@ enum { | |||
5589 | PINFIX_ASUS_A6RP, | 5614 | PINFIX_ASUS_A6RP, |
5590 | }; | 5615 | }; |
5591 | 5616 | ||
5617 | /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */ | ||
5618 | static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec, | ||
5619 | const struct alc_fixup *fix, int action) | ||
5620 | { | ||
5621 | struct alc_spec *spec = codec->spec; | ||
5622 | unsigned int val; | ||
5623 | |||
5624 | if (action != ALC_FIXUP_ACT_INIT) | ||
5625 | return; | ||
5626 | val = snd_hda_codec_read(codec, 0x0f, 0, | ||
5627 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
5628 | if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))) | ||
5629 | val |= AC_PINCTL_IN_EN; | ||
5630 | val |= AC_PINCTL_VREF_50; | ||
5631 | snd_hda_codec_write(codec, 0x0f, 0, | ||
5632 | AC_VERB_SET_PIN_WIDGET_CONTROL, val); | ||
5633 | spec->keep_vref_in_automute = 1; | ||
5634 | } | ||
5635 | |||
5592 | static const struct alc_fixup alc861_fixups[] = { | 5636 | static const struct alc_fixup alc861_fixups[] = { |
5593 | [PINFIX_FSC_AMILO_PI1505] = { | 5637 | [PINFIX_FSC_AMILO_PI1505] = { |
5594 | .type = ALC_FIXUP_PINS, | 5638 | .type = ALC_FIXUP_PINS, |
@@ -5599,17 +5643,14 @@ static const struct alc_fixup alc861_fixups[] = { | |||
5599 | } | 5643 | } |
5600 | }, | 5644 | }, |
5601 | [PINFIX_ASUS_A6RP] = { | 5645 | [PINFIX_ASUS_A6RP] = { |
5602 | .type = ALC_FIXUP_VERBS, | 5646 | .type = ALC_FIXUP_FUNC, |
5603 | .v.verbs = (const struct hda_verb[]) { | 5647 | .v.func = alc861_fixup_asus_amp_vref_0f, |
5604 | /* node 0x0f VREF seems controlling the master output */ | ||
5605 | { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | ||
5606 | { } | ||
5607 | }, | ||
5608 | }, | 5648 | }, |
5609 | }; | 5649 | }; |
5610 | 5650 | ||
5611 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { | 5651 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { |
5612 | SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP), | 5652 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP), |
5653 | SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", PINFIX_ASUS_A6RP), | ||
5613 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), | 5654 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), |
5614 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), | 5655 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), |
5615 | {} | 5656 | {} |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 948f0be2f4f3..6345df131a00 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -5078,9 +5078,9 @@ static int stac92xx_update_led_status(struct hda_codec *codec) | |||
5078 | spec->gpio_dir, spec->gpio_data); | 5078 | spec->gpio_dir, spec->gpio_data); |
5079 | } else { | 5079 | } else { |
5080 | notmtd_lvl = spec->gpio_led_polarity ? | 5080 | notmtd_lvl = spec->gpio_led_polarity ? |
5081 | AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_GRD; | 5081 | AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD; |
5082 | muted_lvl = spec->gpio_led_polarity ? | 5082 | muted_lvl = spec->gpio_led_polarity ? |
5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ; | 5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_50; |
5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; | 5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; |
5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, | 5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, |
5086 | spec->vref_led); | 5086 | spec->vref_led); |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 03e63fed9caf..dff9a00ee8fb 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -199,6 +199,9 @@ struct via_spec { | |||
199 | unsigned int no_pin_power_ctl; | 199 | unsigned int no_pin_power_ctl; |
200 | enum VIA_HDA_CODEC codec_type; | 200 | enum VIA_HDA_CODEC codec_type; |
201 | 201 | ||
202 | /* analog low-power control */ | ||
203 | bool alc_mode; | ||
204 | |||
202 | /* smart51 setup */ | 205 | /* smart51 setup */ |
203 | unsigned int smart51_nums; | 206 | unsigned int smart51_nums; |
204 | hda_nid_t smart51_pins[2]; | 207 | hda_nid_t smart51_pins[2]; |
@@ -663,6 +666,9 @@ static void via_auto_init_analog_input(struct hda_codec *codec) | |||
663 | /* init input-src */ | 666 | /* init input-src */ |
664 | for (i = 0; i < spec->num_adc_nids; i++) { | 667 | for (i = 0; i < spec->num_adc_nids; i++) { |
665 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; | 668 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; |
669 | /* secondary ADCs must have the unique MUX */ | ||
670 | if (i > 0 && !spec->mux_nids[i]) | ||
671 | break; | ||
666 | if (spec->mux_nids[adc_idx]) { | 672 | if (spec->mux_nids[adc_idx]) { |
667 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; | 673 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; |
668 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, | 674 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, |
@@ -687,6 +693,15 @@ static void via_auto_init_analog_input(struct hda_codec *codec) | |||
687 | } | 693 | } |
688 | } | 694 | } |
689 | 695 | ||
696 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, | ||
697 | unsigned int parm) | ||
698 | { | ||
699 | if (snd_hda_codec_read(codec, nid, 0, | ||
700 | AC_VERB_GET_POWER_STATE, 0) == parm) | ||
701 | return; | ||
702 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); | ||
703 | } | ||
704 | |||
690 | static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, | 705 | static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, |
691 | unsigned int *affected_parm) | 706 | unsigned int *affected_parm) |
692 | { | 707 | { |
@@ -709,7 +724,7 @@ static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, | |||
709 | } else | 724 | } else |
710 | parm = AC_PWRST_D3; | 725 | parm = AC_PWRST_D3; |
711 | 726 | ||
712 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); | 727 | update_power_state(codec, nid, parm); |
713 | } | 728 | } |
714 | 729 | ||
715 | static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol, | 730 | static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol, |
@@ -749,6 +764,7 @@ static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol, | |||
749 | return 0; | 764 | return 0; |
750 | spec->no_pin_power_ctl = val; | 765 | spec->no_pin_power_ctl = val; |
751 | set_widgets_power_state(codec); | 766 | set_widgets_power_state(codec); |
767 | analog_low_current_mode(codec); | ||
752 | return 1; | 768 | return 1; |
753 | } | 769 | } |
754 | 770 | ||
@@ -1036,13 +1052,19 @@ static bool is_aa_path_mute(struct hda_codec *codec) | |||
1036 | } | 1052 | } |
1037 | 1053 | ||
1038 | /* enter/exit analog low-current mode */ | 1054 | /* enter/exit analog low-current mode */ |
1039 | static void analog_low_current_mode(struct hda_codec *codec) | 1055 | static void __analog_low_current_mode(struct hda_codec *codec, bool force) |
1040 | { | 1056 | { |
1041 | struct via_spec *spec = codec->spec; | 1057 | struct via_spec *spec = codec->spec; |
1042 | bool enable; | 1058 | bool enable; |
1043 | unsigned int verb, parm; | 1059 | unsigned int verb, parm; |
1044 | 1060 | ||
1045 | enable = is_aa_path_mute(codec) && (spec->opened_streams != 0); | 1061 | if (spec->no_pin_power_ctl) |
1062 | enable = false; | ||
1063 | else | ||
1064 | enable = is_aa_path_mute(codec) && !spec->opened_streams; | ||
1065 | if (enable == spec->alc_mode && !force) | ||
1066 | return; | ||
1067 | spec->alc_mode = enable; | ||
1046 | 1068 | ||
1047 | /* decide low current mode's verb & parameter */ | 1069 | /* decide low current mode's verb & parameter */ |
1048 | switch (spec->codec_type) { | 1070 | switch (spec->codec_type) { |
@@ -1074,6 +1096,11 @@ static void analog_low_current_mode(struct hda_codec *codec) | |||
1074 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); | 1096 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); |
1075 | } | 1097 | } |
1076 | 1098 | ||
1099 | static void analog_low_current_mode(struct hda_codec *codec) | ||
1100 | { | ||
1101 | return __analog_low_current_mode(codec, false); | ||
1102 | } | ||
1103 | |||
1077 | /* | 1104 | /* |
1078 | * generic initialization of ADC, input mixers and output mixers | 1105 | * generic initialization of ADC, input mixers and output mixers |
1079 | */ | 1106 | */ |
@@ -1446,6 +1473,7 @@ static int via_build_controls(struct hda_codec *codec) | |||
1446 | struct snd_kcontrol *kctl; | 1473 | struct snd_kcontrol *kctl; |
1447 | int err, i; | 1474 | int err, i; |
1448 | 1475 | ||
1476 | spec->no_pin_power_ctl = 1; | ||
1449 | if (spec->set_widgets_power_state) | 1477 | if (spec->set_widgets_power_state) |
1450 | if (!via_clone_control(spec, &via_pin_power_ctl_enum)) | 1478 | if (!via_clone_control(spec, &via_pin_power_ctl_enum)) |
1451 | return -ENOMEM; | 1479 | return -ENOMEM; |
@@ -1499,10 +1527,6 @@ static int via_build_controls(struct hda_codec *codec) | |||
1499 | return err; | 1527 | return err; |
1500 | } | 1528 | } |
1501 | 1529 | ||
1502 | /* init power states */ | ||
1503 | set_widgets_power_state(codec); | ||
1504 | analog_low_current_mode(codec); | ||
1505 | |||
1506 | via_free_kctls(codec); /* no longer needed */ | 1530 | via_free_kctls(codec); /* no longer needed */ |
1507 | 1531 | ||
1508 | err = snd_hda_jack_add_kctls(codec, &spec->autocfg); | 1532 | err = snd_hda_jack_add_kctls(codec, &spec->autocfg); |
@@ -2295,10 +2319,7 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol, | |||
2295 | 2319 | ||
2296 | if (mux) { | 2320 | if (mux) { |
2297 | /* switch to D0 beofre change index */ | 2321 | /* switch to D0 beofre change index */ |
2298 | if (snd_hda_codec_read(codec, mux, 0, | 2322 | update_power_state(codec, mux, AC_PWRST_D0); |
2299 | AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0) | ||
2300 | snd_hda_codec_write(codec, mux, 0, | ||
2301 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
2302 | snd_hda_codec_write(codec, mux, 0, | 2323 | snd_hda_codec_write(codec, mux, 0, |
2303 | AC_VERB_SET_CONNECT_SEL, | 2324 | AC_VERB_SET_CONNECT_SEL, |
2304 | spec->inputs[cur].mux_idx); | 2325 | spec->inputs[cur].mux_idx); |
@@ -2776,6 +2797,10 @@ static int via_init(struct hda_codec *codec) | |||
2776 | for (i = 0; i < spec->num_iverbs; i++) | 2797 | for (i = 0; i < spec->num_iverbs; i++) |
2777 | snd_hda_sequence_write(codec, spec->init_verbs[i]); | 2798 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
2778 | 2799 | ||
2800 | /* init power states */ | ||
2801 | set_widgets_power_state(codec); | ||
2802 | __analog_low_current_mode(codec, true); | ||
2803 | |||
2779 | via_auto_init_multi_out(codec); | 2804 | via_auto_init_multi_out(codec); |
2780 | via_auto_init_hp_out(codec); | 2805 | via_auto_init_hp_out(codec); |
2781 | via_auto_init_speaker_out(codec); | 2806 | via_auto_init_speaker_out(codec); |
@@ -2922,9 +2947,9 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2922 | if (imux_is_smixer) | 2947 | if (imux_is_smixer) |
2923 | parm = AC_PWRST_D0; | 2948 | parm = AC_PWRST_D0; |
2924 | /* SW0 (17h), AIW 0/1 (13h/14h) */ | 2949 | /* SW0 (17h), AIW 0/1 (13h/14h) */ |
2925 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm); | 2950 | update_power_state(codec, 0x17, parm); |
2926 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 2951 | update_power_state(codec, 0x13, parm); |
2927 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm); | 2952 | update_power_state(codec, 0x14, parm); |
2928 | 2953 | ||
2929 | /* outputs */ | 2954 | /* outputs */ |
2930 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ | 2955 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ |
@@ -2932,8 +2957,8 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2932 | set_pin_power_state(codec, 0x19, &parm); | 2957 | set_pin_power_state(codec, 0x19, &parm); |
2933 | if (spec->smart51_enabled) | 2958 | if (spec->smart51_enabled) |
2934 | set_pin_power_state(codec, 0x1b, &parm); | 2959 | set_pin_power_state(codec, 0x1b, &parm); |
2935 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 2960 | update_power_state(codec, 0x18, parm); |
2936 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 2961 | update_power_state(codec, 0x11, parm); |
2937 | 2962 | ||
2938 | /* PW6 (22h), SW2 (26h), AOW2 (24h) */ | 2963 | /* PW6 (22h), SW2 (26h), AOW2 (24h) */ |
2939 | if (is_8ch) { | 2964 | if (is_8ch) { |
@@ -2941,20 +2966,16 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2941 | set_pin_power_state(codec, 0x22, &parm); | 2966 | set_pin_power_state(codec, 0x22, &parm); |
2942 | if (spec->smart51_enabled) | 2967 | if (spec->smart51_enabled) |
2943 | set_pin_power_state(codec, 0x1a, &parm); | 2968 | set_pin_power_state(codec, 0x1a, &parm); |
2944 | snd_hda_codec_write(codec, 0x26, 0, | 2969 | update_power_state(codec, 0x26, parm); |
2945 | AC_VERB_SET_POWER_STATE, parm); | 2970 | update_power_state(codec, 0x24, parm); |
2946 | snd_hda_codec_write(codec, 0x24, 0, | ||
2947 | AC_VERB_SET_POWER_STATE, parm); | ||
2948 | } else if (codec->vendor_id == 0x11064397) { | 2971 | } else if (codec->vendor_id == 0x11064397) { |
2949 | /* PW7(23h), SW2(27h), AOW2(25h) */ | 2972 | /* PW7(23h), SW2(27h), AOW2(25h) */ |
2950 | parm = AC_PWRST_D3; | 2973 | parm = AC_PWRST_D3; |
2951 | set_pin_power_state(codec, 0x23, &parm); | 2974 | set_pin_power_state(codec, 0x23, &parm); |
2952 | if (spec->smart51_enabled) | 2975 | if (spec->smart51_enabled) |
2953 | set_pin_power_state(codec, 0x1a, &parm); | 2976 | set_pin_power_state(codec, 0x1a, &parm); |
2954 | snd_hda_codec_write(codec, 0x27, 0, | 2977 | update_power_state(codec, 0x27, parm); |
2955 | AC_VERB_SET_POWER_STATE, parm); | 2978 | update_power_state(codec, 0x25, parm); |
2956 | snd_hda_codec_write(codec, 0x25, 0, | ||
2957 | AC_VERB_SET_POWER_STATE, parm); | ||
2958 | } | 2979 | } |
2959 | 2980 | ||
2960 | /* PW 3/4/7 (1ch/1dh/23h) */ | 2981 | /* PW 3/4/7 (1ch/1dh/23h) */ |
@@ -2966,17 +2987,13 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2966 | set_pin_power_state(codec, 0x23, &parm); | 2987 | set_pin_power_state(codec, 0x23, &parm); |
2967 | 2988 | ||
2968 | /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ | 2989 | /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ |
2969 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, | 2990 | update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); |
2970 | imux_is_smixer ? AC_PWRST_D0 : parm); | 2991 | update_power_state(codec, 0x10, parm); |
2971 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | ||
2972 | if (is_8ch) { | 2992 | if (is_8ch) { |
2973 | snd_hda_codec_write(codec, 0x25, 0, | 2993 | update_power_state(codec, 0x25, parm); |
2974 | AC_VERB_SET_POWER_STATE, parm); | 2994 | update_power_state(codec, 0x27, parm); |
2975 | snd_hda_codec_write(codec, 0x27, 0, | ||
2976 | AC_VERB_SET_POWER_STATE, parm); | ||
2977 | } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode) | 2995 | } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode) |
2978 | snd_hda_codec_write(codec, 0x25, 0, | 2996 | update_power_state(codec, 0x25, parm); |
2979 | AC_VERB_SET_POWER_STATE, parm); | ||
2980 | } | 2997 | } |
2981 | 2998 | ||
2982 | static int patch_vt1708S(struct hda_codec *codec); | 2999 | static int patch_vt1708S(struct hda_codec *codec); |
@@ -3149,10 +3166,10 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec) | |||
3149 | if (imux_is_smixer) | 3166 | if (imux_is_smixer) |
3150 | parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */ | 3167 | parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */ |
3151 | /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ | 3168 | /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ |
3152 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 3169 | update_power_state(codec, 0x13, parm); |
3153 | snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm); | 3170 | update_power_state(codec, 0x12, parm); |
3154 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3171 | update_power_state(codec, 0x1f, parm); |
3155 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm); | 3172 | update_power_state(codec, 0x20, parm); |
3156 | 3173 | ||
3157 | /* outputs */ | 3174 | /* outputs */ |
3158 | /* PW 3/4 (16h/17h) */ | 3175 | /* PW 3/4 (16h/17h) */ |
@@ -3160,10 +3177,9 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec) | |||
3160 | set_pin_power_state(codec, 0x17, &parm); | 3177 | set_pin_power_state(codec, 0x17, &parm); |
3161 | set_pin_power_state(codec, 0x16, &parm); | 3178 | set_pin_power_state(codec, 0x16, &parm); |
3162 | /* MW0 (1ah), AOW 0/1 (10h/1dh) */ | 3179 | /* MW0 (1ah), AOW 0/1 (10h/1dh) */ |
3163 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, | 3180 | update_power_state(codec, 0x1a, imux_is_smixer ? AC_PWRST_D0 : parm); |
3164 | imux_is_smixer ? AC_PWRST_D0 : parm); | 3181 | update_power_state(codec, 0x10, parm); |
3165 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3182 | update_power_state(codec, 0x1d, parm); |
3166 | snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm); | ||
3167 | } | 3183 | } |
3168 | 3184 | ||
3169 | static int patch_vt1702(struct hda_codec *codec) | 3185 | static int patch_vt1702(struct hda_codec *codec) |
@@ -3228,52 +3244,48 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec) | |||
3228 | if (imux_is_smixer) | 3244 | if (imux_is_smixer) |
3229 | parm = AC_PWRST_D0; | 3245 | parm = AC_PWRST_D0; |
3230 | /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3246 | /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3231 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3247 | update_power_state(codec, 0x1e, parm); |
3232 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3248 | update_power_state(codec, 0x1f, parm); |
3233 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3249 | update_power_state(codec, 0x10, parm); |
3234 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3250 | update_power_state(codec, 0x11, parm); |
3235 | 3251 | ||
3236 | /* outputs */ | 3252 | /* outputs */ |
3237 | /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ | 3253 | /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ |
3238 | parm = AC_PWRST_D3; | 3254 | parm = AC_PWRST_D3; |
3239 | set_pin_power_state(codec, 0x27, &parm); | 3255 | set_pin_power_state(codec, 0x27, &parm); |
3240 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm); | 3256 | update_power_state(codec, 0x1a, parm); |
3241 | snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm); | 3257 | update_power_state(codec, 0xb, parm); |
3242 | 3258 | ||
3243 | /* PW2 (26h), AOW2 (ah) */ | 3259 | /* PW2 (26h), AOW2 (ah) */ |
3244 | parm = AC_PWRST_D3; | 3260 | parm = AC_PWRST_D3; |
3245 | set_pin_power_state(codec, 0x26, &parm); | 3261 | set_pin_power_state(codec, 0x26, &parm); |
3246 | if (spec->smart51_enabled) | 3262 | if (spec->smart51_enabled) |
3247 | set_pin_power_state(codec, 0x2b, &parm); | 3263 | set_pin_power_state(codec, 0x2b, &parm); |
3248 | snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm); | 3264 | update_power_state(codec, 0xa, parm); |
3249 | 3265 | ||
3250 | /* PW0 (24h), AOW0 (8h) */ | 3266 | /* PW0 (24h), AOW0 (8h) */ |
3251 | parm = AC_PWRST_D3; | 3267 | parm = AC_PWRST_D3; |
3252 | set_pin_power_state(codec, 0x24, &parm); | 3268 | set_pin_power_state(codec, 0x24, &parm); |
3253 | if (!spec->hp_independent_mode) /* check for redirected HP */ | 3269 | if (!spec->hp_independent_mode) /* check for redirected HP */ |
3254 | set_pin_power_state(codec, 0x28, &parm); | 3270 | set_pin_power_state(codec, 0x28, &parm); |
3255 | snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm); | 3271 | update_power_state(codec, 0x8, parm); |
3256 | /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ | 3272 | /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ |
3257 | snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE, | 3273 | update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm); |
3258 | imux_is_smixer ? AC_PWRST_D0 : parm); | ||
3259 | 3274 | ||
3260 | /* PW1 (25h), AOW1 (9h) */ | 3275 | /* PW1 (25h), AOW1 (9h) */ |
3261 | parm = AC_PWRST_D3; | 3276 | parm = AC_PWRST_D3; |
3262 | set_pin_power_state(codec, 0x25, &parm); | 3277 | set_pin_power_state(codec, 0x25, &parm); |
3263 | if (spec->smart51_enabled) | 3278 | if (spec->smart51_enabled) |
3264 | set_pin_power_state(codec, 0x2a, &parm); | 3279 | set_pin_power_state(codec, 0x2a, &parm); |
3265 | snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm); | 3280 | update_power_state(codec, 0x9, parm); |
3266 | 3281 | ||
3267 | if (spec->hp_independent_mode) { | 3282 | if (spec->hp_independent_mode) { |
3268 | /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ | 3283 | /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ |
3269 | parm = AC_PWRST_D3; | 3284 | parm = AC_PWRST_D3; |
3270 | set_pin_power_state(codec, 0x28, &parm); | 3285 | set_pin_power_state(codec, 0x28, &parm); |
3271 | snd_hda_codec_write(codec, 0x1b, 0, | 3286 | update_power_state(codec, 0x1b, parm); |
3272 | AC_VERB_SET_POWER_STATE, parm); | 3287 | update_power_state(codec, 0x34, parm); |
3273 | snd_hda_codec_write(codec, 0x34, 0, | 3288 | update_power_state(codec, 0xc, parm); |
3274 | AC_VERB_SET_POWER_STATE, parm); | ||
3275 | snd_hda_codec_write(codec, 0xc, 0, | ||
3276 | AC_VERB_SET_POWER_STATE, parm); | ||
3277 | } | 3289 | } |
3278 | } | 3290 | } |
3279 | 3291 | ||
@@ -3433,8 +3445,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3433 | if (imux_is_smixer) | 3445 | if (imux_is_smixer) |
3434 | parm = AC_PWRST_D0; | 3446 | parm = AC_PWRST_D0; |
3435 | /* SW0 (17h), AIW0(13h) */ | 3447 | /* SW0 (17h), AIW0(13h) */ |
3436 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm); | 3448 | update_power_state(codec, 0x17, parm); |
3437 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 3449 | update_power_state(codec, 0x13, parm); |
3438 | 3450 | ||
3439 | parm = AC_PWRST_D3; | 3451 | parm = AC_PWRST_D3; |
3440 | set_pin_power_state(codec, 0x1e, &parm); | 3452 | set_pin_power_state(codec, 0x1e, &parm); |
@@ -3442,12 +3454,11 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3442 | if (spec->dmic_enabled) | 3454 | if (spec->dmic_enabled) |
3443 | set_pin_power_state(codec, 0x22, &parm); | 3455 | set_pin_power_state(codec, 0x22, &parm); |
3444 | else | 3456 | else |
3445 | snd_hda_codec_write(codec, 0x22, 0, | 3457 | update_power_state(codec, 0x22, AC_PWRST_D3); |
3446 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3447 | 3458 | ||
3448 | /* SW2(26h), AIW1(14h) */ | 3459 | /* SW2(26h), AIW1(14h) */ |
3449 | snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm); | 3460 | update_power_state(codec, 0x26, parm); |
3450 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm); | 3461 | update_power_state(codec, 0x14, parm); |
3451 | 3462 | ||
3452 | /* outputs */ | 3463 | /* outputs */ |
3453 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ | 3464 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ |
@@ -3456,8 +3467,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3456 | /* Smart 5.1 PW2(1bh) */ | 3467 | /* Smart 5.1 PW2(1bh) */ |
3457 | if (spec->smart51_enabled) | 3468 | if (spec->smart51_enabled) |
3458 | set_pin_power_state(codec, 0x1b, &parm); | 3469 | set_pin_power_state(codec, 0x1b, &parm); |
3459 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 3470 | update_power_state(codec, 0x18, parm); |
3460 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3471 | update_power_state(codec, 0x11, parm); |
3461 | 3472 | ||
3462 | /* PW7 (23h), SW3 (27h), AOW3 (25h) */ | 3473 | /* PW7 (23h), SW3 (27h), AOW3 (25h) */ |
3463 | parm = AC_PWRST_D3; | 3474 | parm = AC_PWRST_D3; |
@@ -3465,12 +3476,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3465 | /* Smart 5.1 PW1(1ah) */ | 3476 | /* Smart 5.1 PW1(1ah) */ |
3466 | if (spec->smart51_enabled) | 3477 | if (spec->smart51_enabled) |
3467 | set_pin_power_state(codec, 0x1a, &parm); | 3478 | set_pin_power_state(codec, 0x1a, &parm); |
3468 | snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm); | 3479 | update_power_state(codec, 0x27, parm); |
3469 | 3480 | ||
3470 | /* Smart 5.1 PW5(1eh) */ | 3481 | /* Smart 5.1 PW5(1eh) */ |
3471 | if (spec->smart51_enabled) | 3482 | if (spec->smart51_enabled) |
3472 | set_pin_power_state(codec, 0x1e, &parm); | 3483 | set_pin_power_state(codec, 0x1e, &parm); |
3473 | snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm); | 3484 | update_power_state(codec, 0x25, parm); |
3474 | 3485 | ||
3475 | /* Mono out */ | 3486 | /* Mono out */ |
3476 | /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ | 3487 | /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ |
@@ -3486,9 +3497,9 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3486 | mono_out = 1; | 3497 | mono_out = 1; |
3487 | } | 3498 | } |
3488 | parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; | 3499 | parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; |
3489 | snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm); | 3500 | update_power_state(codec, 0x28, parm); |
3490 | snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm); | 3501 | update_power_state(codec, 0x29, parm); |
3491 | snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm); | 3502 | update_power_state(codec, 0x2a, parm); |
3492 | 3503 | ||
3493 | /* PW 3/4 (1ch/1dh) */ | 3504 | /* PW 3/4 (1ch/1dh) */ |
3494 | parm = AC_PWRST_D3; | 3505 | parm = AC_PWRST_D3; |
@@ -3496,15 +3507,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3496 | set_pin_power_state(codec, 0x1d, &parm); | 3507 | set_pin_power_state(codec, 0x1d, &parm); |
3497 | /* HP Independent Mode, power on AOW3 */ | 3508 | /* HP Independent Mode, power on AOW3 */ |
3498 | if (spec->hp_independent_mode) | 3509 | if (spec->hp_independent_mode) |
3499 | snd_hda_codec_write(codec, 0x25, 0, | 3510 | update_power_state(codec, 0x25, parm); |
3500 | AC_VERB_SET_POWER_STATE, parm); | ||
3501 | 3511 | ||
3502 | /* force to D0 for internal Speaker */ | 3512 | /* force to D0 for internal Speaker */ |
3503 | /* MW0 (16h), AOW0 (10h) */ | 3513 | /* MW0 (16h), AOW0 (10h) */ |
3504 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, | 3514 | update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); |
3505 | imux_is_smixer ? AC_PWRST_D0 : parm); | 3515 | update_power_state(codec, 0x10, mono_out ? AC_PWRST_D0 : parm); |
3506 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, | ||
3507 | mono_out ? AC_PWRST_D0 : parm); | ||
3508 | } | 3516 | } |
3509 | 3517 | ||
3510 | static int patch_vt1716S(struct hda_codec *codec) | 3518 | static int patch_vt1716S(struct hda_codec *codec) |
@@ -3580,54 +3588,45 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3580 | set_pin_power_state(codec, 0x2b, &parm); | 3588 | set_pin_power_state(codec, 0x2b, &parm); |
3581 | parm = AC_PWRST_D0; | 3589 | parm = AC_PWRST_D0; |
3582 | /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3590 | /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3583 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3591 | update_power_state(codec, 0x1e, parm); |
3584 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3592 | update_power_state(codec, 0x1f, parm); |
3585 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3593 | update_power_state(codec, 0x10, parm); |
3586 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3594 | update_power_state(codec, 0x11, parm); |
3587 | 3595 | ||
3588 | /* outputs */ | 3596 | /* outputs */ |
3589 | /* AOW0 (8h)*/ | 3597 | /* AOW0 (8h)*/ |
3590 | snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm); | 3598 | update_power_state(codec, 0x8, parm); |
3591 | 3599 | ||
3592 | if (spec->codec_type == VT1802) { | 3600 | if (spec->codec_type == VT1802) { |
3593 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ | 3601 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ |
3594 | parm = AC_PWRST_D3; | 3602 | parm = AC_PWRST_D3; |
3595 | set_pin_power_state(codec, 0x28, &parm); | 3603 | set_pin_power_state(codec, 0x28, &parm); |
3596 | snd_hda_codec_write(codec, 0x18, 0, | 3604 | update_power_state(codec, 0x18, parm); |
3597 | AC_VERB_SET_POWER_STATE, parm); | 3605 | update_power_state(codec, 0x38, parm); |
3598 | snd_hda_codec_write(codec, 0x38, 0, | ||
3599 | AC_VERB_SET_POWER_STATE, parm); | ||
3600 | } else { | 3606 | } else { |
3601 | /* PW4 (26h), MW4 (1ch), MUX4(37h) */ | 3607 | /* PW4 (26h), MW4 (1ch), MUX4(37h) */ |
3602 | parm = AC_PWRST_D3; | 3608 | parm = AC_PWRST_D3; |
3603 | set_pin_power_state(codec, 0x26, &parm); | 3609 | set_pin_power_state(codec, 0x26, &parm); |
3604 | snd_hda_codec_write(codec, 0x1c, 0, | 3610 | update_power_state(codec, 0x1c, parm); |
3605 | AC_VERB_SET_POWER_STATE, parm); | 3611 | update_power_state(codec, 0x37, parm); |
3606 | snd_hda_codec_write(codec, 0x37, 0, | ||
3607 | AC_VERB_SET_POWER_STATE, parm); | ||
3608 | } | 3612 | } |
3609 | 3613 | ||
3610 | if (spec->codec_type == VT1802) { | 3614 | if (spec->codec_type == VT1802) { |
3611 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ | 3615 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ |
3612 | parm = AC_PWRST_D3; | 3616 | parm = AC_PWRST_D3; |
3613 | set_pin_power_state(codec, 0x25, &parm); | 3617 | set_pin_power_state(codec, 0x25, &parm); |
3614 | snd_hda_codec_write(codec, 0x15, 0, | 3618 | update_power_state(codec, 0x15, parm); |
3615 | AC_VERB_SET_POWER_STATE, parm); | 3619 | update_power_state(codec, 0x35, parm); |
3616 | snd_hda_codec_write(codec, 0x35, 0, | ||
3617 | AC_VERB_SET_POWER_STATE, parm); | ||
3618 | } else { | 3620 | } else { |
3619 | /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ | 3621 | /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ |
3620 | parm = AC_PWRST_D3; | 3622 | parm = AC_PWRST_D3; |
3621 | set_pin_power_state(codec, 0x25, &parm); | 3623 | set_pin_power_state(codec, 0x25, &parm); |
3622 | snd_hda_codec_write(codec, 0x19, 0, | 3624 | update_power_state(codec, 0x19, parm); |
3623 | AC_VERB_SET_POWER_STATE, parm); | 3625 | update_power_state(codec, 0x35, parm); |
3624 | snd_hda_codec_write(codec, 0x35, 0, | ||
3625 | AC_VERB_SET_POWER_STATE, parm); | ||
3626 | } | 3626 | } |
3627 | 3627 | ||
3628 | if (spec->hp_independent_mode) | 3628 | if (spec->hp_independent_mode) |
3629 | snd_hda_codec_write(codec, 0x9, 0, | 3629 | update_power_state(codec, 0x9, AC_PWRST_D0); |
3630 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3631 | 3630 | ||
3632 | /* Class-D */ | 3631 | /* Class-D */ |
3633 | /* PW0 (24h), MW0(18h/14h), MUX0(34h) */ | 3632 | /* PW0 (24h), MW0(18h/14h), MUX0(34h) */ |
@@ -3637,12 +3636,10 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3637 | set_pin_power_state(codec, 0x24, &parm); | 3636 | set_pin_power_state(codec, 0x24, &parm); |
3638 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; | 3637 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; |
3639 | if (spec->codec_type == VT1802) | 3638 | if (spec->codec_type == VT1802) |
3640 | snd_hda_codec_write(codec, 0x14, 0, | 3639 | update_power_state(codec, 0x14, parm); |
3641 | AC_VERB_SET_POWER_STATE, parm); | ||
3642 | else | 3640 | else |
3643 | snd_hda_codec_write(codec, 0x18, 0, | 3641 | update_power_state(codec, 0x18, parm); |
3644 | AC_VERB_SET_POWER_STATE, parm); | 3642 | update_power_state(codec, 0x34, parm); |
3645 | snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm); | ||
3646 | 3643 | ||
3647 | /* Mono Out */ | 3644 | /* Mono Out */ |
3648 | present = snd_hda_jack_detect(codec, 0x26); | 3645 | present = snd_hda_jack_detect(codec, 0x26); |
@@ -3650,28 +3647,20 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3650 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; | 3647 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; |
3651 | if (spec->codec_type == VT1802) { | 3648 | if (spec->codec_type == VT1802) { |
3652 | /* PW15 (33h), MW8(1ch), MUX8(3ch) */ | 3649 | /* PW15 (33h), MW8(1ch), MUX8(3ch) */ |
3653 | snd_hda_codec_write(codec, 0x33, 0, | 3650 | update_power_state(codec, 0x33, parm); |
3654 | AC_VERB_SET_POWER_STATE, parm); | 3651 | update_power_state(codec, 0x1c, parm); |
3655 | snd_hda_codec_write(codec, 0x1c, 0, | 3652 | update_power_state(codec, 0x3c, parm); |
3656 | AC_VERB_SET_POWER_STATE, parm); | ||
3657 | snd_hda_codec_write(codec, 0x3c, 0, | ||
3658 | AC_VERB_SET_POWER_STATE, parm); | ||
3659 | } else { | 3653 | } else { |
3660 | /* PW15 (31h), MW8(17h), MUX8(3bh) */ | 3654 | /* PW15 (31h), MW8(17h), MUX8(3bh) */ |
3661 | snd_hda_codec_write(codec, 0x31, 0, | 3655 | update_power_state(codec, 0x31, parm); |
3662 | AC_VERB_SET_POWER_STATE, parm); | 3656 | update_power_state(codec, 0x17, parm); |
3663 | snd_hda_codec_write(codec, 0x17, 0, | 3657 | update_power_state(codec, 0x3b, parm); |
3664 | AC_VERB_SET_POWER_STATE, parm); | ||
3665 | snd_hda_codec_write(codec, 0x3b, 0, | ||
3666 | AC_VERB_SET_POWER_STATE, parm); | ||
3667 | } | 3658 | } |
3668 | /* MW9 (21h) */ | 3659 | /* MW9 (21h) */ |
3669 | if (imux_is_smixer || !is_aa_path_mute(codec)) | 3660 | if (imux_is_smixer || !is_aa_path_mute(codec)) |
3670 | snd_hda_codec_write(codec, 0x21, 0, | 3661 | update_power_state(codec, 0x21, AC_PWRST_D0); |
3671 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3672 | else | 3662 | else |
3673 | snd_hda_codec_write(codec, 0x21, 0, | 3663 | update_power_state(codec, 0x21, AC_PWRST_D3); |
3674 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3675 | } | 3664 | } |
3676 | 3665 | ||
3677 | /* patch for vt2002P */ | 3666 | /* patch for vt2002P */ |
@@ -3731,30 +3720,28 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3731 | set_pin_power_state(codec, 0x2b, &parm); | 3720 | set_pin_power_state(codec, 0x2b, &parm); |
3732 | parm = AC_PWRST_D0; | 3721 | parm = AC_PWRST_D0; |
3733 | /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3722 | /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3734 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3723 | update_power_state(codec, 0x1e, parm); |
3735 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3724 | update_power_state(codec, 0x1f, parm); |
3736 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3725 | update_power_state(codec, 0x10, parm); |
3737 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3726 | update_power_state(codec, 0x11, parm); |
3738 | 3727 | ||
3739 | /* outputs */ | 3728 | /* outputs */ |
3740 | /* AOW0 (8h)*/ | 3729 | /* AOW0 (8h)*/ |
3741 | snd_hda_codec_write(codec, 0x8, 0, | 3730 | update_power_state(codec, 0x8, AC_PWRST_D0); |
3742 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3743 | 3731 | ||
3744 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ | 3732 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ |
3745 | parm = AC_PWRST_D3; | 3733 | parm = AC_PWRST_D3; |
3746 | set_pin_power_state(codec, 0x28, &parm); | 3734 | set_pin_power_state(codec, 0x28, &parm); |
3747 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 3735 | update_power_state(codec, 0x18, parm); |
3748 | snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm); | 3736 | update_power_state(codec, 0x38, parm); |
3749 | 3737 | ||
3750 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ | 3738 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ |
3751 | parm = AC_PWRST_D3; | 3739 | parm = AC_PWRST_D3; |
3752 | set_pin_power_state(codec, 0x25, &parm); | 3740 | set_pin_power_state(codec, 0x25, &parm); |
3753 | snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm); | 3741 | update_power_state(codec, 0x15, parm); |
3754 | snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm); | 3742 | update_power_state(codec, 0x35, parm); |
3755 | if (spec->hp_independent_mode) | 3743 | if (spec->hp_independent_mode) |
3756 | snd_hda_codec_write(codec, 0x9, 0, | 3744 | update_power_state(codec, 0x9, AC_PWRST_D0); |
3757 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3758 | 3745 | ||
3759 | /* Internal Speaker */ | 3746 | /* Internal Speaker */ |
3760 | /* PW0 (24h), MW0(14h), MUX0(34h) */ | 3747 | /* PW0 (24h), MW0(14h), MUX0(34h) */ |
@@ -3763,15 +3750,11 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3763 | parm = AC_PWRST_D3; | 3750 | parm = AC_PWRST_D3; |
3764 | set_pin_power_state(codec, 0x24, &parm); | 3751 | set_pin_power_state(codec, 0x24, &parm); |
3765 | if (present) { | 3752 | if (present) { |
3766 | snd_hda_codec_write(codec, 0x14, 0, | 3753 | update_power_state(codec, 0x14, AC_PWRST_D3); |
3767 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3754 | update_power_state(codec, 0x34, AC_PWRST_D3); |
3768 | snd_hda_codec_write(codec, 0x34, 0, | ||
3769 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3770 | } else { | 3755 | } else { |
3771 | snd_hda_codec_write(codec, 0x14, 0, | 3756 | update_power_state(codec, 0x14, AC_PWRST_D0); |
3772 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | 3757 | update_power_state(codec, 0x34, AC_PWRST_D0); |
3773 | snd_hda_codec_write(codec, 0x34, 0, | ||
3774 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3775 | } | 3758 | } |
3776 | 3759 | ||
3777 | 3760 | ||
@@ -3782,26 +3765,20 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3782 | parm = AC_PWRST_D3; | 3765 | parm = AC_PWRST_D3; |
3783 | set_pin_power_state(codec, 0x31, &parm); | 3766 | set_pin_power_state(codec, 0x31, &parm); |
3784 | if (present) { | 3767 | if (present) { |
3785 | snd_hda_codec_write(codec, 0x1c, 0, | 3768 | update_power_state(codec, 0x1c, AC_PWRST_D3); |
3786 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3769 | update_power_state(codec, 0x3c, AC_PWRST_D3); |
3787 | snd_hda_codec_write(codec, 0x3c, 0, | 3770 | update_power_state(codec, 0x3e, AC_PWRST_D3); |
3788 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3789 | snd_hda_codec_write(codec, 0x3e, 0, | ||
3790 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3791 | } else { | 3771 | } else { |
3792 | snd_hda_codec_write(codec, 0x1c, 0, | 3772 | update_power_state(codec, 0x1c, AC_PWRST_D0); |
3793 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | 3773 | update_power_state(codec, 0x3c, AC_PWRST_D0); |
3794 | snd_hda_codec_write(codec, 0x3c, 0, | 3774 | update_power_state(codec, 0x3e, AC_PWRST_D0); |
3795 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3796 | snd_hda_codec_write(codec, 0x3e, 0, | ||
3797 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3798 | } | 3775 | } |
3799 | 3776 | ||
3800 | /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ | 3777 | /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ |
3801 | parm = AC_PWRST_D3; | 3778 | parm = AC_PWRST_D3; |
3802 | set_pin_power_state(codec, 0x33, &parm); | 3779 | set_pin_power_state(codec, 0x33, &parm); |
3803 | snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm); | 3780 | update_power_state(codec, 0x1d, parm); |
3804 | snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm); | 3781 | update_power_state(codec, 0x3d, parm); |
3805 | 3782 | ||
3806 | } | 3783 | } |
3807 | 3784 | ||
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 9f3b01bb72c8..e0a4263baa20 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -2102,6 +2102,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
2102 | }, | 2102 | }, |
2103 | { | 2103 | { |
2104 | .subvendor = 0x161f, | 2104 | .subvendor = 0x161f, |
2105 | .subdevice = 0x202f, | ||
2106 | .name = "Gateway M520", | ||
2107 | .type = AC97_TUNE_INV_EAPD | ||
2108 | }, | ||
2109 | { | ||
2110 | .subvendor = 0x161f, | ||
2105 | .subdevice = 0x203a, | 2111 | .subdevice = 0x203a, |
2106 | .name = "Gateway 4525GZ", /* AD1981B */ | 2112 | .name = "Gateway 4525GZ", /* AD1981B */ |
2107 | .type = AC97_TUNE_INV_EAPD | 2113 | .type = AC97_TUNE_INV_EAPD |
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 26c7e8bcb229..c0dbb52d45be 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
@@ -618,9 +618,12 @@ static int ac97_volume_get(struct snd_kcontrol *ctl, | |||
618 | mutex_lock(&chip->mutex); | 618 | mutex_lock(&chip->mutex); |
619 | reg = oxygen_read_ac97(chip, codec, index); | 619 | reg = oxygen_read_ac97(chip, codec, index); |
620 | mutex_unlock(&chip->mutex); | 620 | mutex_unlock(&chip->mutex); |
621 | value->value.integer.value[0] = 31 - (reg & 0x1f); | 621 | if (!stereo) { |
622 | if (stereo) | 622 | value->value.integer.value[0] = 31 - (reg & 0x1f); |
623 | value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f); | 623 | } else { |
624 | value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f); | ||
625 | value->value.integer.value[1] = 31 - (reg & 0x1f); | ||
626 | } | ||
624 | return 0; | 627 | return 0; |
625 | } | 628 | } |
626 | 629 | ||
@@ -636,14 +639,14 @@ static int ac97_volume_put(struct snd_kcontrol *ctl, | |||
636 | 639 | ||
637 | mutex_lock(&chip->mutex); | 640 | mutex_lock(&chip->mutex); |
638 | oldreg = oxygen_read_ac97(chip, codec, index); | 641 | oldreg = oxygen_read_ac97(chip, codec, index); |
639 | newreg = oldreg; | 642 | if (!stereo) { |
640 | newreg = (newreg & ~0x1f) | | 643 | newreg = oldreg & ~0x1f; |
641 | (31 - (value->value.integer.value[0] & 0x1f)); | 644 | newreg |= 31 - (value->value.integer.value[0] & 0x1f); |
642 | if (stereo) | 645 | } else { |
643 | newreg = (newreg & ~0x1f00) | | 646 | newreg = oldreg & ~0x1f1f; |
644 | ((31 - (value->value.integer.value[1] & 0x1f)) << 8); | 647 | newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8; |
645 | else | 648 | newreg |= 31 - (value->value.integer.value[1] & 0x1f); |
646 | newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8); | 649 | } |
647 | change = newreg != oldreg; | 650 | change = newreg != oldreg; |
648 | if (change) | 651 | if (change) |
649 | oxygen_write_ac97(chip, codec, index, newreg); | 652 | oxygen_write_ac97(chip, codec, index, newreg); |
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index 9d38db8f1919..78979b3e0e95 100644 --- a/sound/soc/codecs/cs42l73.c +++ b/sound/soc/codecs/cs42l73.c | |||
@@ -1113,7 +1113,7 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, | |||
1113 | priv->config[id].mmcc &= 0xC0; | 1113 | priv->config[id].mmcc &= 0xC0; |
1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; | 1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; |
1115 | priv->config[id].spc &= 0xFC; | 1115 | priv->config[id].spc &= 0xFC; |
1116 | priv->config[id].spc &= MCK_SCLK_64FS; | 1116 | priv->config[id].spc |= MCK_SCLK_MCLK; |
1117 | } else { | 1117 | } else { |
1118 | /* CS42L73 Slave */ | 1118 | /* CS42L73 Slave */ |
1119 | priv->config[id].spc &= 0xFC; | 1119 | priv->config[id].spc &= 0xFC; |
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c index 66f0611e68b6..89f2af77b1c3 100644 --- a/sound/soc/codecs/wm5100.c +++ b/sound/soc/codecs/wm5100.c | |||
@@ -1405,6 +1405,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, | |||
1405 | 1405 | ||
1406 | case SND_SOC_BIAS_OFF: | 1406 | case SND_SOC_BIAS_OFF: |
1407 | regcache_cache_only(wm5100->regmap, true); | 1407 | regcache_cache_only(wm5100->regmap, true); |
1408 | regcache_mark_dirty(wm5100->regmap); | ||
1408 | if (wm5100->pdata.ldo_ena) | 1409 | if (wm5100->pdata.ldo_ena) |
1409 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); | 1410 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); |
1410 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), | 1411 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), |
@@ -2183,6 +2184,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec) | |||
2183 | if (wm5100->jack_detecting) { | 2184 | if (wm5100->jack_detecting) { |
2184 | dev_dbg(codec->dev, "Microphone detected\n"); | 2185 | dev_dbg(codec->dev, "Microphone detected\n"); |
2185 | wm5100->jack_mic = true; | 2186 | wm5100->jack_mic = true; |
2187 | wm5100->jack_detecting = false; | ||
2186 | snd_soc_jack_report(wm5100->jack, | 2188 | snd_soc_jack_report(wm5100->jack, |
2187 | SND_JACK_HEADSET, | 2189 | SND_JACK_HEADSET, |
2188 | SND_JACK_HEADSET | SND_JACK_BTN_0); | 2190 | SND_JACK_HEADSET | SND_JACK_BTN_0); |
@@ -2221,6 +2223,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec) | |||
2221 | SND_JACK_BTN_0); | 2223 | SND_JACK_BTN_0); |
2222 | } else if (wm5100->jack_detecting) { | 2224 | } else if (wm5100->jack_detecting) { |
2223 | dev_dbg(codec->dev, "Headphone detected\n"); | 2225 | dev_dbg(codec->dev, "Headphone detected\n"); |
2226 | wm5100->jack_detecting = false; | ||
2224 | snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE, | 2227 | snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE, |
2225 | SND_JACK_HEADPHONE); | 2228 | SND_JACK_HEADPHONE); |
2226 | 2229 | ||
@@ -2610,6 +2613,13 @@ static const struct regmap_config wm5100_regmap = { | |||
2610 | .cache_type = REGCACHE_RBTREE, | 2613 | .cache_type = REGCACHE_RBTREE, |
2611 | }; | 2614 | }; |
2612 | 2615 | ||
2616 | static const unsigned int wm5100_mic_ctrl_reg[] = { | ||
2617 | WM5100_IN1L_CONTROL, | ||
2618 | WM5100_IN2L_CONTROL, | ||
2619 | WM5100_IN3L_CONTROL, | ||
2620 | WM5100_IN4L_CONTROL, | ||
2621 | }; | ||
2622 | |||
2613 | static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, | 2623 | static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, |
2614 | const struct i2c_device_id *id) | 2624 | const struct i2c_device_id *id) |
2615 | { | 2625 | { |
@@ -2742,7 +2752,7 @@ static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, | |||
2742 | } | 2752 | } |
2743 | 2753 | ||
2744 | for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) { | 2754 | for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) { |
2745 | regmap_update_bits(wm5100->regmap, WM5100_IN1L_CONTROL, | 2755 | regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i], |
2746 | WM5100_IN1_MODE_MASK | | 2756 | WM5100_IN1_MODE_MASK | |
2747 | WM5100_IN1_DMIC_SUP_MASK, | 2757 | WM5100_IN1_DMIC_SUP_MASK, |
2748 | (wm5100->pdata.in_mode[i] << | 2758 | (wm5100->pdata.in_mode[i] << |
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 296de4e30d26..29c4b02c4790 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
@@ -96,7 +96,7 @@ static int wm8962_regulator_event_##n(struct notifier_block *nb, \ | |||
96 | struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ | 96 | struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ |
97 | disable_nb[n]); \ | 97 | disable_nb[n]); \ |
98 | if (event & REGULATOR_EVENT_DISABLE) { \ | 98 | if (event & REGULATOR_EVENT_DISABLE) { \ |
99 | regcache_cache_only(wm8962->regmap, true); \ | 99 | regcache_mark_dirty(wm8962->regmap); \ |
100 | } \ | 100 | } \ |
101 | return 0; \ | 101 | return 0; \ |
102 | } | 102 | } |
@@ -3159,13 +3159,13 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream, | |||
3159 | case SNDRV_PCM_FORMAT_S16_LE: | 3159 | case SNDRV_PCM_FORMAT_S16_LE: |
3160 | break; | 3160 | break; |
3161 | case SNDRV_PCM_FORMAT_S20_3LE: | 3161 | case SNDRV_PCM_FORMAT_S20_3LE: |
3162 | aif0 |= 0x40; | 3162 | aif0 |= 0x4; |
3163 | break; | 3163 | break; |
3164 | case SNDRV_PCM_FORMAT_S24_LE: | 3164 | case SNDRV_PCM_FORMAT_S24_LE: |
3165 | aif0 |= 0x80; | 3165 | aif0 |= 0x8; |
3166 | break; | 3166 | break; |
3167 | case SNDRV_PCM_FORMAT_S32_LE: | 3167 | case SNDRV_PCM_FORMAT_S32_LE: |
3168 | aif0 |= 0xc0; | 3168 | aif0 |= 0xc; |
3169 | break; | 3169 | break; |
3170 | default: | 3170 | default: |
3171 | return -EINVAL; | 3171 | return -EINVAL; |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 93d27b660257..ec69a6c152fe 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -770,6 +770,8 @@ static void vmid_reference(struct snd_soc_codec *codec) | |||
770 | { | 770 | { |
771 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 771 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
772 | 772 | ||
773 | pm_runtime_get_sync(codec->dev); | ||
774 | |||
773 | wm8994->vmid_refcount++; | 775 | wm8994->vmid_refcount++; |
774 | 776 | ||
775 | dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", | 777 | dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", |
@@ -783,7 +785,12 @@ static void vmid_reference(struct snd_soc_codec *codec) | |||
783 | WM8994_VMID_RAMP_MASK, | 785 | WM8994_VMID_RAMP_MASK, |
784 | WM8994_STARTUP_BIAS_ENA | | 786 | WM8994_STARTUP_BIAS_ENA | |
785 | WM8994_VMID_BUF_ENA | | 787 | WM8994_VMID_BUF_ENA | |
786 | (0x11 << WM8994_VMID_RAMP_SHIFT)); | 788 | (0x3 << WM8994_VMID_RAMP_SHIFT)); |
789 | |||
790 | /* Remove discharge for line out */ | ||
791 | snd_soc_update_bits(codec, WM8994_ANTIPOP_1, | ||
792 | WM8994_LINEOUT1_DISCH | | ||
793 | WM8994_LINEOUT2_DISCH, 0); | ||
787 | 794 | ||
788 | /* Main bias enable, VMID=2x40k */ | 795 | /* Main bias enable, VMID=2x40k */ |
789 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, | 796 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
@@ -837,6 +844,8 @@ static void vmid_dereference(struct snd_soc_codec *codec) | |||
837 | WM8994_VMID_BUF_ENA | | 844 | WM8994_VMID_BUF_ENA | |
838 | WM8994_VMID_RAMP_MASK, 0); | 845 | WM8994_VMID_RAMP_MASK, 0); |
839 | } | 846 | } |
847 | |||
848 | pm_runtime_put(codec->dev); | ||
840 | } | 849 | } |
841 | 850 | ||
842 | static int vmid_event(struct snd_soc_dapm_widget *w, | 851 | static int vmid_event(struct snd_soc_dapm_widget *w, |
@@ -2753,11 +2762,6 @@ static int wm8994_resume(struct snd_soc_codec *codec) | |||
2753 | codec->cache_only = 0; | 2762 | codec->cache_only = 0; |
2754 | } | 2763 | } |
2755 | 2764 | ||
2756 | /* Restore the registers */ | ||
2757 | ret = snd_soc_cache_sync(codec); | ||
2758 | if (ret != 0) | ||
2759 | dev_err(codec->dev, "Failed to sync cache: %d\n", ret); | ||
2760 | |||
2761 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 2765 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
2762 | 2766 | ||
2763 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { | 2767 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { |
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c index 13aa2bdaa7d7..61f7daa4d0e6 100644 --- a/sound/soc/codecs/wm8996.c +++ b/sound/soc/codecs/wm8996.c | |||
@@ -108,7 +108,7 @@ static int wm8996_regulator_event_##n(struct notifier_block *nb, \ | |||
108 | struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \ | 108 | struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \ |
109 | disable_nb[n]); \ | 109 | disable_nb[n]); \ |
110 | if (event & REGULATOR_EVENT_DISABLE) { \ | 110 | if (event & REGULATOR_EVENT_DISABLE) { \ |
111 | regcache_cache_only(wm8996->regmap, true); \ | 111 | regcache_mark_dirty(wm8996->regmap); \ |
112 | } \ | 112 | } \ |
113 | return 0; \ | 113 | return 0; \ |
114 | } | 114 | } |
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 2a61094075f8..8a68cea4a3ee 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c | |||
@@ -586,14 +586,14 @@ SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 0, 1, 0), | |||
586 | }; | 586 | }; |
587 | 587 | ||
588 | static const struct snd_kcontrol_new line2_mix[] = { | 588 | static const struct snd_kcontrol_new line2_mix[] = { |
589 | SOC_DAPM_SINGLE("IN2R Switch", WM8993_LINE_MIXER2, 2, 1, 0), | 589 | SOC_DAPM_SINGLE("IN1L Switch", WM8993_LINE_MIXER2, 2, 1, 0), |
590 | SOC_DAPM_SINGLE("IN2L Switch", WM8993_LINE_MIXER2, 1, 1, 0), | 590 | SOC_DAPM_SINGLE("IN1R Switch", WM8993_LINE_MIXER2, 1, 1, 0), |
591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), | 591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), |
592 | }; | 592 | }; |
593 | 593 | ||
594 | static const struct snd_kcontrol_new line2n_mix[] = { | 594 | static const struct snd_kcontrol_new line2n_mix[] = { |
595 | SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), | 595 | SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), |
596 | SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), | 596 | SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), |
597 | }; | 597 | }; |
598 | 598 | ||
599 | static const struct snd_kcontrol_new line2p_mix[] = { | 599 | static const struct snd_kcontrol_new line2p_mix[] = { |
@@ -613,6 +613,8 @@ SND_SOC_DAPM_INPUT("IN2RP:VXRP"), | |||
613 | SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0), | 613 | SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0), |
614 | SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0), | 614 | SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0), |
615 | 615 | ||
616 | SND_SOC_DAPM_SUPPLY("LINEOUT_VMID_BUF", WM8993_ANTIPOP1, 7, 0, NULL, 0), | ||
617 | |||
616 | SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0, | 618 | SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0, |
617 | in1l_pga, ARRAY_SIZE(in1l_pga)), | 619 | in1l_pga, ARRAY_SIZE(in1l_pga)), |
618 | SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0, | 620 | SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0, |
@@ -834,9 +836,11 @@ static const struct snd_soc_dapm_route lineout1_diff_routes[] = { | |||
834 | }; | 836 | }; |
835 | 837 | ||
836 | static const struct snd_soc_dapm_route lineout1_se_routes[] = { | 838 | static const struct snd_soc_dapm_route lineout1_se_routes[] = { |
839 | { "LINEOUT1N Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
837 | { "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" }, | 840 | { "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" }, |
838 | { "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" }, | 841 | { "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" }, |
839 | 842 | ||
843 | { "LINEOUT1P Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
840 | { "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" }, | 844 | { "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" }, |
841 | 845 | ||
842 | { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" }, | 846 | { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" }, |
@@ -844,8 +848,8 @@ static const struct snd_soc_dapm_route lineout1_se_routes[] = { | |||
844 | }; | 848 | }; |
845 | 849 | ||
846 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { | 850 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { |
847 | { "LINEOUT2 Mixer", "IN2L Switch", "IN2L PGA" }, | 851 | { "LINEOUT2 Mixer", "IN1L Switch", "IN1L PGA" }, |
848 | { "LINEOUT2 Mixer", "IN2R Switch", "IN2R PGA" }, | 852 | { "LINEOUT2 Mixer", "IN1R Switch", "IN1R PGA" }, |
849 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, | 853 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, |
850 | 854 | ||
851 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, | 855 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, |
@@ -853,9 +857,11 @@ static const struct snd_soc_dapm_route lineout2_diff_routes[] = { | |||
853 | }; | 857 | }; |
854 | 858 | ||
855 | static const struct snd_soc_dapm_route lineout2_se_routes[] = { | 859 | static const struct snd_soc_dapm_route lineout2_se_routes[] = { |
860 | { "LINEOUT2N Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
856 | { "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" }, | 861 | { "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" }, |
857 | { "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" }, | 862 | { "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" }, |
858 | 863 | ||
864 | { "LINEOUT2P Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
859 | { "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" }, | 865 | { "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" }, |
860 | 866 | ||
861 | { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" }, | 867 | { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" }, |
diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c index 7ac0ba2025c3..c6012ff5bd3e 100644 --- a/sound/soc/samsung/neo1973_wm8753.c +++ b/sound/soc/samsung/neo1973_wm8753.c | |||
@@ -230,8 +230,6 @@ static const struct snd_kcontrol_new neo1973_wm8753_controls[] = { | |||
230 | 230 | ||
231 | /* GTA02 specific routes and controls */ | 231 | /* GTA02 specific routes and controls */ |
232 | 232 | ||
233 | #ifdef CONFIG_MACH_NEO1973_GTA02 | ||
234 | |||
235 | static int gta02_speaker_enabled; | 233 | static int gta02_speaker_enabled; |
236 | 234 | ||
237 | static int lm4853_set_spk(struct snd_kcontrol *kcontrol, | 235 | static int lm4853_set_spk(struct snd_kcontrol *kcontrol, |
@@ -311,10 +309,6 @@ static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) | |||
311 | return 0; | 309 | return 0; |
312 | } | 310 | } |
313 | 311 | ||
314 | #else | ||
315 | static int neo1973_gta02_wm8753_init(struct snd_soc_code *codec) { return 0; } | ||
316 | #endif | ||
317 | |||
318 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | 312 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) |
319 | { | 313 | { |
320 | struct snd_soc_codec *codec = rtd->codec; | 314 | struct snd_soc_codec *codec = rtd->codec; |
@@ -322,10 +316,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | |||
322 | int ret; | 316 | int ret; |
323 | 317 | ||
324 | /* set up NC codec pins */ | 318 | /* set up NC codec pins */ |
325 | if (machine_is_neo1973_gta01()) { | ||
326 | snd_soc_dapm_nc_pin(dapm, "LOUT2"); | ||
327 | snd_soc_dapm_nc_pin(dapm, "ROUT2"); | ||
328 | } | ||
329 | snd_soc_dapm_nc_pin(dapm, "OUT3"); | 319 | snd_soc_dapm_nc_pin(dapm, "OUT3"); |
330 | snd_soc_dapm_nc_pin(dapm, "OUT4"); | 320 | snd_soc_dapm_nc_pin(dapm, "OUT4"); |
331 | snd_soc_dapm_nc_pin(dapm, "LINE1"); | 321 | snd_soc_dapm_nc_pin(dapm, "LINE1"); |
@@ -370,50 +360,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | |||
370 | return 0; | 360 | return 0; |
371 | } | 361 | } |
372 | 362 | ||
373 | /* GTA01 specific controls */ | ||
374 | |||
375 | #ifdef CONFIG_MACH_NEO1973_GTA01 | ||
376 | |||
377 | static const struct snd_soc_dapm_route neo1973_lm4857_routes[] = { | ||
378 | {"Amp IN", NULL, "ROUT1"}, | ||
379 | {"Amp IN", NULL, "LOUT1"}, | ||
380 | |||
381 | {"Handset Spk", NULL, "Amp EP"}, | ||
382 | {"Stereo Out", NULL, "Amp LS"}, | ||
383 | {"Headphone", NULL, "Amp HP"}, | ||
384 | }; | ||
385 | |||
386 | static const struct snd_soc_dapm_widget neo1973_lm4857_dapm_widgets[] = { | ||
387 | SND_SOC_DAPM_SPK("Handset Spk", NULL), | ||
388 | SND_SOC_DAPM_SPK("Stereo Out", NULL), | ||
389 | SND_SOC_DAPM_HP("Headphone", NULL), | ||
390 | }; | ||
391 | |||
392 | static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) | ||
393 | { | ||
394 | int ret; | ||
395 | |||
396 | ret = snd_soc_dapm_new_controls(dapm, neo1973_lm4857_dapm_widgets, | ||
397 | ARRAY_SIZE(neo1973_lm4857_dapm_widgets)); | ||
398 | if (ret) | ||
399 | return ret; | ||
400 | |||
401 | ret = snd_soc_dapm_add_routes(dapm, neo1973_lm4857_routes, | ||
402 | ARRAY_SIZE(neo1973_lm4857_routes)); | ||
403 | if (ret) | ||
404 | return ret; | ||
405 | |||
406 | snd_soc_dapm_ignore_suspend(dapm, "Stereo Out"); | ||
407 | snd_soc_dapm_ignore_suspend(dapm, "Handset Spk"); | ||
408 | snd_soc_dapm_ignore_suspend(dapm, "Headphone"); | ||
409 | |||
410 | return 0; | ||
411 | } | ||
412 | |||
413 | #else | ||
414 | static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) { return 0; }; | ||
415 | #endif | ||
416 | |||
417 | static struct snd_soc_dai_link neo1973_dai[] = { | 363 | static struct snd_soc_dai_link neo1973_dai[] = { |
418 | { /* Hifi Playback - for similatious use with voice below */ | 364 | { /* Hifi Playback - for similatious use with voice below */ |
419 | .name = "WM8753", | 365 | .name = "WM8753", |
@@ -440,11 +386,6 @@ static struct snd_soc_aux_dev neo1973_aux_devs[] = { | |||
440 | .name = "dfbmcs320", | 386 | .name = "dfbmcs320", |
441 | .codec_name = "dfbmcs320.0", | 387 | .codec_name = "dfbmcs320.0", |
442 | }, | 388 | }, |
443 | { | ||
444 | .name = "lm4857", | ||
445 | .codec_name = "lm4857.0-007c", | ||
446 | .init = neo1973_lm4857_init, | ||
447 | }, | ||
448 | }; | 389 | }; |
449 | 390 | ||
450 | static struct snd_soc_codec_conf neo1973_codec_conf[] = { | 391 | static struct snd_soc_codec_conf neo1973_codec_conf[] = { |
@@ -454,14 +395,10 @@ static struct snd_soc_codec_conf neo1973_codec_conf[] = { | |||
454 | }, | 395 | }, |
455 | }; | 396 | }; |
456 | 397 | ||
457 | #ifdef CONFIG_MACH_NEO1973_GTA02 | ||
458 | static const struct gpio neo1973_gta02_gpios[] = { | 398 | static const struct gpio neo1973_gta02_gpios[] = { |
459 | { GTA02_GPIO_HP_IN, GPIOF_OUT_INIT_HIGH, "GTA02_HP_IN" }, | 399 | { GTA02_GPIO_HP_IN, GPIOF_OUT_INIT_HIGH, "GTA02_HP_IN" }, |
460 | { GTA02_GPIO_AMP_SHUT, GPIOF_OUT_INIT_HIGH, "GTA02_AMP_SHUT" }, | 400 | { GTA02_GPIO_AMP_SHUT, GPIOF_OUT_INIT_HIGH, "GTA02_AMP_SHUT" }, |
461 | }; | 401 | }; |
462 | #else | ||
463 | static const struct gpio neo1973_gta02_gpios[] = {}; | ||
464 | #endif | ||
465 | 402 | ||
466 | static struct snd_soc_card neo1973 = { | 403 | static struct snd_soc_card neo1973 = { |
467 | .name = "neo1973", | 404 | .name = "neo1973", |
@@ -480,7 +417,7 @@ static int __init neo1973_init(void) | |||
480 | { | 417 | { |
481 | int ret; | 418 | int ret; |
482 | 419 | ||
483 | if (!machine_is_neo1973_gta01() && !machine_is_neo1973_gta02()) | 420 | if (!machine_is_neo1973_gta02()) |
484 | return -ENODEV; | 421 | return -ENODEV; |
485 | 422 | ||
486 | if (machine_is_neo1973_gta02()) { | 423 | if (machine_is_neo1973_gta02()) { |
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index db6c89a28bda..ea4a82d01160 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c | |||
@@ -1152,12 +1152,8 @@ static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream) | |||
1152 | { | 1152 | { |
1153 | struct fsi_priv *fsi = fsi_get_priv(substream); | 1153 | struct fsi_priv *fsi = fsi_get_priv(substream); |
1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); | 1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); |
1155 | int samples_pos = io->buff_sample_pos - 1; | ||
1156 | 1155 | ||
1157 | if (samples_pos < 0) | 1156 | return fsi_sample2frame(fsi, io->buff_sample_pos); |
1158 | samples_pos = 0; | ||
1159 | |||
1160 | return fsi_sample2frame(fsi, samples_pos); | ||
1161 | } | 1157 | } |
1162 | 1158 | ||
1163 | static struct snd_pcm_ops fsi_pcm_ops = { | 1159 | static struct snd_pcm_ops fsi_pcm_ops = { |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index b5ecf6d23214..92cee24ed2dc 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -567,6 +567,17 @@ int snd_soc_suspend(struct device *dev) | |||
567 | if (!codec->suspended && codec->driver->suspend) { | 567 | if (!codec->suspended && codec->driver->suspend) { |
568 | switch (codec->dapm.bias_level) { | 568 | switch (codec->dapm.bias_level) { |
569 | case SND_SOC_BIAS_STANDBY: | 569 | case SND_SOC_BIAS_STANDBY: |
570 | /* | ||
571 | * If the CODEC is capable of idle | ||
572 | * bias off then being in STANDBY | ||
573 | * means it's doing something, | ||
574 | * otherwise fall through. | ||
575 | */ | ||
576 | if (codec->dapm.idle_bias_off) { | ||
577 | dev_dbg(codec->dev, | ||
578 | "idle_bias_off CODEC on over suspend\n"); | ||
579 | break; | ||
580 | } | ||
570 | case SND_SOC_BIAS_OFF: | 581 | case SND_SOC_BIAS_OFF: |
571 | codec->driver->suspend(codec); | 582 | codec->driver->suspend(codec); |
572 | codec->suspended = 1; | 583 | codec->suspended = 1; |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 8edc5035fc8f..d89ab4c7d44b 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
@@ -1618,6 +1618,14 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
1618 | } | 1618 | } |
1619 | }, | 1619 | }, |
1620 | { | 1620 | { |
1621 | /* Edirol UM-3G */ | ||
1622 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), | ||
1623 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
1624 | .ifnum = 0, | ||
1625 | .type = QUIRK_MIDI_STANDARD_INTERFACE | ||
1626 | } | ||
1627 | }, | ||
1628 | { | ||
1621 | /* Boss JS-8 Jam Station */ | 1629 | /* Boss JS-8 Jam Station */ |
1622 | USB_DEVICE(0x0582, 0x0109), | 1630 | USB_DEVICE(0x0582, 0x0109), |
1623 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 1631 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |