Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

sound fixes for 3.3-rc6 from Takashi Iwai

This contains again regression fixes for various HD-audio and ASoC
regarding SSI and dapm shutdown path. In addition, a minor azt3328
fix and the correction of the new jack-notification strings in HD-audio.

* tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda - Kill hyphenated names
ALSA: hda - Add a fake mute feature
ALSA: hda - Always set HP pin in unsol handler for STAC/IDT codecs
ALSA: azt3328 - Fix NULL ptr dereference on cards without OPL3
ALSA: hda/realtek - Fix resume of multiple input sources
ASoC: i.MX SSI: Fix DSP_A format.
ASoC: dapm: Check for bias level when powering down

+51 -19
+1 -2
sound/pci/azt3328.c
··· 2684 2684 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); 2685 2685 if (err < 0) 2686 2686 goto out_err; 2687 + opl3->private_data = chip; 2687 2688 } 2688 - 2689 - opl3->private_data = chip; 2690 2689 2691 2690 sprintf(card->longname, "%s at 0x%lx, irq %i", 2692 2691 card->shortname, chip->ctrl_io, chip->irq);
+8 -4
sound/pci/hda/hda_codec.c
··· 1759 1759 parm = ch ? AC_AMP_SET_RIGHT : AC_AMP_SET_LEFT; 1760 1760 parm |= direction == HDA_OUTPUT ? AC_AMP_SET_OUTPUT : AC_AMP_SET_INPUT; 1761 1761 parm |= index << AC_AMP_SET_INDEX_SHIFT; 1762 - parm |= val; 1762 + if ((val & HDA_AMP_MUTE) && !(info->amp_caps & AC_AMPCAP_MUTE) && 1763 + (info->amp_caps & AC_AMPCAP_MIN_MUTE)) 1764 + ; /* set the zero value as a fake mute */ 1765 + else 1766 + parm |= val; 1763 1767 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, parm); 1764 1768 info->vol[ch] = val; 1765 1769 } ··· 2030 2026 val1 = -((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT); 2031 2027 val1 += ofs; 2032 2028 val1 = ((int)val1) * ((int)val2); 2033 - if (min_mute) 2029 + if (min_mute || (caps & AC_AMPCAP_MIN_MUTE)) 2034 2030 val2 |= TLV_DB_SCALE_MUTE; 2035 2031 if (put_user(SNDRV_CTL_TLVT_DB_SCALE, _tlv)) 2036 2032 return -EFAULT; ··· 5118 5114 const char *pfx = "", *sfx = ""; 5119 5115 5120 5116 /* handle as a speaker if it's a fixed line-out */ 5121 - if (!strcmp(name, "Line-Out") && attr == INPUT_PIN_ATTR_INT) 5117 + if (!strcmp(name, "Line Out") && attr == INPUT_PIN_ATTR_INT) 5122 5118 name = "Speaker"; 5123 5119 /* check the location */ 5124 5120 switch (attr) { ··· 5177 5173 5178 5174 switch (get_defcfg_device(def_conf)) { 5179 5175 case AC_JACK_LINE_OUT: 5180 - return fill_audio_out_name(codec, nid, cfg, "Line-Out", 5176 + return fill_audio_out_name(codec, nid, cfg, "Line Out", 5181 5177 label, maxlen, indexp); 5182 5178 case AC_JACK_SPEAKER: 5183 5179 return fill_audio_out_name(codec, nid, cfg, "Speaker",
+3
sound/pci/hda/hda_codec.h
··· 298 298 #define AC_AMPCAP_MUTE (1<<31) /* mute capable */ 299 299 #define AC_AMPCAP_MUTE_SHIFT 31 300 300 301 + /* driver-specific amp-caps: using bits 24-30 */ 302 + #define AC_AMPCAP_MIN_MUTE (1 << 30) /* min-volume = mute */ 303 + 301 304 /* Connection list */ 302 305 #define AC_CLIST_LENGTH (0x7f<<0) 303 306 #define AC_CLIST_LONG (1<<7)
+2 -2
sound/pci/hda/patch_cirrus.c
··· 609 609 "Front Speaker", "Surround Speaker", "Bass Speaker" 610 610 }; 611 611 static const char * const line_outs[] = { 612 - "Front Line-Out", "Surround Line-Out", "Bass Line-Out" 612 + "Front Line Out", "Surround Line Out", "Bass Line Out" 613 613 }; 614 614 615 615 fix_volume_caps(codec, dac); ··· 635 635 if (num_ctls > 1) 636 636 name = line_outs[idx]; 637 637 else 638 - name = "Line-Out"; 638 + name = "Line Out"; 639 639 break; 640 640 } 641 641
+22 -2
sound/pci/hda/patch_conexant.c
··· 3482 3482 "Disabled", "Enabled" 3483 3483 }; 3484 3484 static const char * const texts3[] = { 3485 - "Disabled", "Speaker Only", "Line-Out+Speaker" 3485 + "Disabled", "Speaker Only", "Line Out+Speaker" 3486 3486 }; 3487 3487 const char * const *texts; 3488 3488 ··· 4079 4079 err = snd_hda_ctl_add(codec, nid, kctl); 4080 4080 if (err < 0) 4081 4081 return err; 4082 - if (!(query_amp_caps(codec, nid, hda_dir) & AC_AMPCAP_MUTE)) 4082 + if (!(query_amp_caps(codec, nid, hda_dir) & 4083 + (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE))) 4083 4084 break; 4084 4085 } 4085 4086 return 0; ··· 4380 4379 {} 4381 4380 }; 4382 4381 4382 + /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches 4383 + * can be created (bko#42825) 4384 + */ 4385 + static void add_cx5051_fake_mutes(struct hda_codec *codec) 4386 + { 4387 + static hda_nid_t out_nids[] = { 4388 + 0x10, 0x11, 0 4389 + }; 4390 + hda_nid_t *p; 4391 + 4392 + for (p = out_nids; *p; p++) 4393 + snd_hda_override_amp_caps(codec, *p, HDA_OUTPUT, 4394 + AC_AMPCAP_MIN_MUTE | 4395 + query_amp_caps(codec, *p, HDA_OUTPUT)); 4396 + } 4397 + 4383 4398 static int patch_conexant_auto(struct hda_codec *codec) 4384 4399 { 4385 4400 struct conexant_spec *spec; ··· 4413 4396 switch (codec->vendor_id) { 4414 4397 case 0x14f15045: 4415 4398 spec->single_adc_amp = 1; 4399 + break; 4400 + case 0x14f15051: 4401 + add_cx5051_fake_mutes(codec); 4416 4402 break; 4417 4403 } 4418 4404
+4 -4
sound/pci/hda/patch_realtek.c
··· 802 802 "Disabled", "Enabled" 803 803 }; 804 804 static const char * const texts3[] = { 805 - "Disabled", "Speaker Only", "Line-Out+Speaker" 805 + "Disabled", "Speaker Only", "Line Out+Speaker" 806 806 }; 807 807 const char * const *texts; 808 808 ··· 1856 1856 "Headphone Playback Volume", 1857 1857 "Speaker Playback Volume", 1858 1858 "Mono Playback Volume", 1859 - "Line-Out Playback Volume", 1859 + "Line Out Playback Volume", 1860 1860 "CLFE Playback Volume", 1861 1861 "Bass Speaker Playback Volume", 1862 1862 "PCM Playback Volume", ··· 1873 1873 "Speaker Playback Switch", 1874 1874 "Mono Playback Switch", 1875 1875 "IEC958 Playback Switch", 1876 - "Line-Out Playback Switch", 1876 + "Line Out Playback Switch", 1877 1877 "CLFE Playback Switch", 1878 1878 "Bass Speaker Playback Switch", 1879 1879 "PCM Playback Switch", ··· 3797 3797 else 3798 3798 nums = spec->num_adc_nids; 3799 3799 for (c = 0; c < nums; c++) 3800 - alc_mux_select(codec, 0, spec->cur_mux[c], true); 3800 + alc_mux_select(codec, c, spec->cur_mux[c], true); 3801 3801 } 3802 3802 3803 3803 /* add mic boosts if needed */
+1 -1
sound/pci/hda/patch_sigmatel.c
··· 4629 4629 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN; 4630 4630 if (no_hp_sensing(spec, i)) 4631 4631 continue; 4632 - if (presence) 4632 + if (1 /*presence*/) 4633 4633 stac92xx_set_pinctl(codec, cfg->hp_pins[i], val); 4634 4634 #if 0 /* FIXME */ 4635 4635 /* Resetting the pinctl like below may lead to (a sort of) regressions
+1 -1
sound/soc/imx/imx-ssi.c
··· 112 112 break; 113 113 case SND_SOC_DAIFMT_DSP_A: 114 114 /* data on rising edge of bclk, frame high 1clk before data */ 115 - strcr |= SSI_STCR_TFSL | SSI_STCR_TEFS; 115 + strcr |= SSI_STCR_TFSL | SSI_STCR_TXBIT0 | SSI_STCR_TEFS; 116 116 break; 117 117 } 118 118
+9 -3
sound/soc/soc-dapm.c
··· 3068 3068 * standby. 3069 3069 */ 3070 3070 if (powerdown) { 3071 - snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_PREPARE); 3071 + if (dapm->bias_level == SND_SOC_BIAS_ON) 3072 + snd_soc_dapm_set_bias_level(dapm, 3073 + SND_SOC_BIAS_PREPARE); 3072 3074 dapm_seq_run(dapm, &down_list, 0, false); 3073 - snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY); 3075 + if (dapm->bias_level == SND_SOC_BIAS_PREPARE) 3076 + snd_soc_dapm_set_bias_level(dapm, 3077 + SND_SOC_BIAS_STANDBY); 3074 3078 } 3075 3079 } 3076 3080 ··· 3087 3083 3088 3084 list_for_each_entry(codec, &card->codec_dev_list, list) { 3089 3085 soc_dapm_shutdown_codec(&codec->dapm); 3090 - snd_soc_dapm_set_bias_level(&codec->dapm, SND_SOC_BIAS_OFF); 3086 + if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) 3087 + snd_soc_dapm_set_bias_level(&codec->dapm, 3088 + SND_SOC_BIAS_OFF); 3091 3089 } 3092 3090 } 3093 3091