diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 07:07:14 +0900 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 07:07:14 +0900 | 
| commit | f5a246eab9a268f51ba8189ea5b098a1bfff200e (patch) | |
| tree | a6ff7169e0bcaca498d9aec8b0624de1b74eaecb /sound/pci/hda/patch_conexant.c | |
| parent | d5bbd43d5f450c3fca058f5b85f3dfb4e8cc88c9 (diff) | |
| parent | 7ff34ad80b7080fafaac8efa9ef0061708eddd51 (diff) | |
| download | olio-linux-3.10-f5a246eab9a268f51ba8189ea5b098a1bfff200e.tar.xz olio-linux-3.10-f5a246eab9a268f51ba8189ea5b098a1bfff200e.zip  | |
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai:
 "This contains pretty many small commits covering fairly large range of
  files in sound/ directory.  Partly because of additional API support
  and partly because of constantly developed ASoC and ARM stuff.
  Some highlights:
   - Introduced the helper function and documentation for exposing the
     channel map via control API, as discussed in Plumbers; most of PCI
     drivers are covered, will follow more drivers later
   - Most of drivers have been replaced with the new PM callbacks (if
     the bus is supported)
   - HD-audio controller got the support of runtime PM and the support
     of D3 clock-stop.  Also changing the power_save option in sysfs
     kicks off immediately to enable / disable the power-save mode.
   - Another significant code change in HD-audio is the rewrite of
     firmware loading code.  Other than that, most of changes in
     HD-audio are continued cleanups and standardization for the generic
     auto parser and bug fixes (HBR, device-specific fixups), in
     addition to the support of channel-map API.
   - Addition of ASoC bindings for the compressed API, used by the
     mid-x86 drivers.
   - Lots of cleanups and API refreshes for ASoC codec drivers and
     DaVinci.
   - Conversion of OMAP to dmaengine.
   - New machine driver for Wolfson Microelectronics Bells.
   - New CODEC driver for Wolfson Microelectronics WM0010.
   - Enhancements to the ux500 and wm2000 drivers
   - A new driver for DA9055 and the support for regulator bypass mode."
Fix up various arm soc header file reorg conflicts.
* tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (339 commits)
  ALSA: hda - Add new codec ALC283 ALC290 support
  ALSA: hda - avoid unneccesary indices on "Headphone Jack" controls
  ALSA: hda - fix indices on boost volume on Conexant
  ALSA: aloop - add locking to timer access
  ALSA: hda - Fix hang caused by race during suspend.
  sound: Remove unnecessary semicolon
  ALSA: hda/realtek - Fix detection of ALC271X codec
  ALSA: hda - Add inverted internal mic quirk for Lenovo IdeaPad U310
  ALSA: hda - make Realtek/Sigmatel/Conexant use the generic unsol event
  ALSA: hda - make a generic unsol event handler
  ASoC: codecs: Add DA9055 codec driver
  ASoC: eukrea-tlv320: Convert it to platform driver
  ALSA: ASoC: add DT bindings for CS4271
  ASoC: wm_hubs: Ensure volume updates are handled during class W startup
  ASoC: wm5110: Adding missing volume update bits
  ASoC: wm5110: Add OUT3R support
  ASoC: wm5110: Add AEC loopback support
  ASoC: wm5110: Rename EPOUT to HPOUT3
  ASoC: arizona: Add more clock rates
  ASoC: arizona: Add more DSP options for mixer input muxes
  ...
Diffstat (limited to 'sound/pci/hda/patch_conexant.c')
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 78 | 
1 files changed, 38 insertions, 40 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 5e22a8f43d2..03b1dc317ff 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -553,7 +553,7 @@ static int conexant_build_controls(struct hda_codec *codec)  	return 0;  } -#ifdef CONFIG_SND_HDA_POWER_SAVE +#ifdef CONFIG_PM  static int conexant_suspend(struct hda_codec *codec)  {  	snd_hda_shutup_pins(codec); @@ -567,7 +567,7 @@ static const struct hda_codec_ops conexant_patch_ops = {  	.init = conexant_init,  	.free = conexant_free,  	.set_power_state = conexant_set_power, -#ifdef CONFIG_SND_HDA_POWER_SAVE +#ifdef CONFIG_PM  	.suspend = conexant_suspend,  #endif  	.reboot_notify = snd_hda_shutup_pins, @@ -1710,8 +1710,8 @@ static const struct snd_kcontrol_new cxt5051_capture_mixers[] = {  	HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT),  	HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x01, HDA_INPUT),  	HDA_CODEC_MUTE("Mic Switch", 0x14, 0x01, HDA_INPUT), -	HDA_CODEC_VOLUME("Docking Mic Volume", 0x15, 0x00, HDA_INPUT), -	HDA_CODEC_MUTE("Docking Mic Switch", 0x15, 0x00, HDA_INPUT), +	HDA_CODEC_VOLUME("Dock Mic Volume", 0x15, 0x00, HDA_INPUT), +	HDA_CODEC_MUTE("Dock Mic Switch", 0x15, 0x00, HDA_INPUT),  	{}  }; @@ -3402,7 +3402,7 @@ static void cx_auto_update_speakers(struct hda_codec *codec)  	do_automute(codec, cfg->line_outs, cfg->line_out_pins, on);  } -static void cx_auto_hp_automute(struct hda_codec *codec) +static void cx_auto_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)  {  	struct conexant_spec *spec = codec->spec;  	struct auto_pin_cfg *cfg = &spec->autocfg; @@ -3413,7 +3413,7 @@ static void cx_auto_hp_automute(struct hda_codec *codec)  	cx_auto_update_speakers(codec);  } -static void cx_auto_line_automute(struct hda_codec *codec) +static void cx_auto_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)  {  	struct conexant_spec *spec = codec->spec;  	struct auto_pin_cfg *cfg = &spec->autocfg; @@ -3540,8 +3540,9 @@ static int __select_input_connection(struct hda_codec *codec, hda_nid_t mux,  				     hda_nid_t pin, hda_nid_t *srcp,  				     bool do_select, int depth)  { +	struct conexant_spec *spec = codec->spec;  	hda_nid_t conn[HDA_MAX_NUM_INPUTS]; -	int i, nums; +	int startidx, i, nums;  	switch (get_wcaps_type(get_wcaps(codec, mux))) {  	case AC_WID_AUD_IN: @@ -3565,14 +3566,25 @@ static int __select_input_connection(struct hda_codec *codec, hda_nid_t mux,  	depth++;  	if (depth == 2)  		return -1; + +	/* Try to rotate around connections to avoid one boost controlling +	   another input path as well */ +	startidx = 0; +	for (i = 0; i < spec->private_imux.num_items; i++) +		if (spec->imux_info[i].pin == pin) { +			startidx = i; +			break; +		} +  	for (i = 0; i < nums; i++) { -		int ret  = __select_input_connection(codec, conn[i], pin, srcp, +		int j = (i + startidx) % nums; +		int ret  = __select_input_connection(codec, conn[j], pin, srcp,  						     do_select, depth);  		if (ret >= 0) {  			if (do_select)  				snd_hda_codec_write(codec, mux, 0, -						    AC_VERB_SET_CONNECT_SEL, i); -			return i; +						    AC_VERB_SET_CONNECT_SEL, j); +			return j;  		}  	}  	return -1; @@ -3652,7 +3664,7 @@ static bool select_automic(struct hda_codec *codec, int idx, bool detect)  }  /* automatic switch internal and external mic */ -static void cx_auto_automic(struct hda_codec *codec) +static void cx_auto_automic(struct hda_codec *codec, struct hda_jack_tbl *jack)  {  	struct conexant_spec *spec = codec->spec; @@ -3663,22 +3675,6 @@ static void cx_auto_automic(struct hda_codec *codec)  			select_automic(codec, spec->auto_mic_int, false);  } -static void cx_auto_unsol_event(struct hda_codec *codec, unsigned int res) -{ -	switch (snd_hda_jack_get_action(codec, res >> 26)) { -	case CONEXANT_HP_EVENT: -		cx_auto_hp_automute(codec); -		break; -	case CONEXANT_LINE_EVENT: -		cx_auto_line_automute(codec); -		break; -	case CONEXANT_MIC_EVENT: -		cx_auto_automic(codec); -		break; -	} -	snd_hda_jack_report_sync(codec); -} -  /* check whether the pin config is suitable for auto-mic switching;   * auto-mic is enabled only when one int-mic and one ext- and/or   * one dock-mic exist @@ -3888,11 +3884,12 @@ static void mute_outputs(struct hda_codec *codec, int num_nids,  }  static void enable_unsol_pins(struct hda_codec *codec, int num_pins, -			      hda_nid_t *pins, unsigned int action) +			      hda_nid_t *pins, unsigned int action, +			      hda_jack_callback cb)  {  	int i;  	for (i = 0; i < num_pins; i++) -		snd_hda_jack_detect_enable(codec, pins[i], action); +		snd_hda_jack_detect_enable_callback(codec, pins[i], action, cb);  }  static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) @@ -3980,13 +3977,14 @@ static void cx_auto_init_output(struct hda_codec *codec)  	}  	if (spec->auto_mute) {  		enable_unsol_pins(codec, cfg->hp_outs, cfg->hp_pins, -				  CONEXANT_HP_EVENT); +				  CONEXANT_HP_EVENT, cx_auto_hp_automute);  		spec->hp_present = detect_jacks(codec, cfg->hp_outs,  						cfg->hp_pins);  		if (spec->detect_line) {  			enable_unsol_pins(codec, cfg->line_outs,  					  cfg->line_out_pins, -					  CONEXANT_LINE_EVENT); +					  CONEXANT_LINE_EVENT, +					  cx_auto_line_automute);  			spec->line_present =  				detect_jacks(codec, cfg->line_outs,  					     cfg->line_out_pins); @@ -4027,16 +4025,16 @@ static void cx_auto_init_input(struct hda_codec *codec)  	if (spec->auto_mic) {  		if (spec->auto_mic_ext >= 0) { -			snd_hda_jack_detect_enable(codec, +			snd_hda_jack_detect_enable_callback(codec,  				cfg->inputs[spec->auto_mic_ext].pin, -				CONEXANT_MIC_EVENT); +				CONEXANT_MIC_EVENT, cx_auto_automic);  		}  		if (spec->auto_mic_dock >= 0) { -			snd_hda_jack_detect_enable(codec, +			snd_hda_jack_detect_enable_callback(codec,  				cfg->inputs[spec->auto_mic_dock].pin, -				CONEXANT_MIC_EVENT); +				CONEXANT_MIC_EVENT, cx_auto_automic);  		} -		cx_auto_automic(codec); +		cx_auto_automic(codec, NULL);  	} else {  		select_input_connection(codec, spec->imux_info[0].adc,  					spec->imux_info[0].pin); @@ -4061,7 +4059,6 @@ static int cx_auto_init(struct hda_codec *codec)  	cx_auto_init_output(codec);  	cx_auto_init_input(codec);  	cx_auto_init_digital(codec); -	snd_hda_jack_report_sync(codec);  	snd_hda_sync_vmaster_hook(&spec->vmaster_mute);  	return 0;  } @@ -4262,7 +4259,7 @@ static int cx_auto_add_boost_volume(struct hda_codec *codec, int idx,  	if (get_wcaps(codec, mux) & AC_WCAP_OUT_AMP) {  		spec->imux_info[idx].boost = mux; -		return cx_auto_add_volume(codec, label, " Boost", 0, +		return cx_auto_add_volume(codec, label, " Boost", cidx,  					  mux, HDA_OUTPUT);  	}  	return 0; @@ -4395,8 +4392,8 @@ static const struct hda_codec_ops cx_auto_patch_ops = {  	.build_pcms = conexant_build_pcms,  	.init = cx_auto_init,  	.free = conexant_free, -	.unsol_event = cx_auto_unsol_event, -#ifdef CONFIG_SND_HDA_POWER_SAVE +	.unsol_event = snd_hda_jack_unsol_event, +#ifdef CONFIG_PM  	.suspend = conexant_suspend,  #endif  	.reboot_notify = snd_hda_shutup_pins, @@ -4462,6 +4459,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {  	SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410),  	SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410),  	SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC), +	SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC),  	SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),  	{}  };  |