diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 11:51:23 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 11:51:23 -0800 | 
| commit | 046e7d685bc370fd4c879ab6635ad3f69e6673d1 (patch) | |
| tree | 36b981f8d1f2bfd348c1479acbe3a9426d35c377 /sound/pci/hda/hda_auto_parser.c | |
| parent | fe504c5c745aeb767d978fbedeb94775fd4cb69c (diff) | |
| parent | 6eb827d23577a4efec2b10a9c4cc9ded268a1d1c (diff) | |
| download | olio-linux-3.10-046e7d685bc370fd4c879ab6635ad3f69e6673d1.tar.xz olio-linux-3.10-046e7d685bc370fd4c879ab6635ad3f69e6673d1.zip  | |
Merge tag 'sound-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai:
 "This update contains a fairly wide range of changes all over in sound
  subdirectory, mainly because of UAPI header moves by David and __dev*
  annotation removals by Bill.  Other highlights are:
   - Introduced the support for wallclock timestamps in ALSA PCM core
   - Add the poll loop implementation for HD-audio jack detection
   - Yet more VGA-switcheroo fixes for HD-audio
   - New VIA HD-audio codec support
   - More fixes on resource management in USB audio and MIDI drivers
   - More quirks for USB-audio ASUS Xonar U3, Reloop Play, Focusrite,
     Roland VG-99, etc
   - Add support for FastTrack C400 usb-audio
   - Clean ups in many drivers regarding firmware loading
   - Add PSC724 Ultiimate Edge support to ice1712
   - A few hdspm driver updates
   - New Stanton SCS.1d/1m FireWire driver
   - Standardisation of the logging in ASoC codes
   - DT and dmaengine support for ASoC Atmel
   - Support for Wolfson ADSP cores
   - New drivers for Freescale/iVeia P1022 and Maxim MAX98090
   - Lots of other ASoC driver fixes and developments"
Fix up trivial conflicts.  And go out on a limb and assume the dts file
'status' field of one of the conflicting things was supposed to be
"disabled", not "disable" like in pretty much all other cases.
* tag 'sound-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (341 commits)
  ALSA: hda - Move runtime PM check to runtime_idle callback
  ALSA: hda - Add stereo-dmic fixup for Acer Aspire One 522
  ALSA: hda - Avoid doubly suspend after vga switcheroo
  ALSA: usb-audio: Enable S/PDIF on the ASUS Xonar U3
  ALSA: hda - Check validity of CORB/RIRB WP reads
  ALSA: hda - use usleep_range in link reset and change timeout check
  ALSA: HDA: VIA: Add support for codec VT1808.
  ALSA: HDA: VIA Add support for codec VT1705CF.
  ASoC: codecs: remove __dev* attributes
  ASoC: utils: remove __dev* attributes
  ASoC: ux500: remove __dev* attributes
  ASoC: txx9: remove __dev* attributes
  ASoC: tegra: remove __dev* attributes
  ASoC: spear: remove __dev* attributes
  ASoC: sh: remove __dev* attributes
  ASoC: s6000: remove __dev* attributes
  ASoC: OMAP: remove __dev* attributes
  ASoC: nuc900: remove __dev* attributes
  ASoC: mxs: remove __dev* attributes
  ASoC: kirkwood: remove __dev* attributes
  ...
Diffstat (limited to 'sound/pci/hda/hda_auto_parser.c')
| -rw-r--r-- | sound/pci/hda/hda_auto_parser.c | 106 | 
1 files changed, 47 insertions, 59 deletions
diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c index 4ec6dc88b7f..7da883a464e 100644 --- a/sound/pci/hda/hda_auto_parser.c +++ b/sound/pci/hda/hda_auto_parser.c @@ -11,6 +11,7 @@  #include <linux/slab.h>  #include <linux/export.h> +#include <linux/sort.h>  #include <sound/core.h>  #include "hda_codec.h"  #include "hda_local.h" @@ -30,29 +31,30 @@ static int is_in_nid_list(hda_nid_t nid, const hda_nid_t *list)  	return 0;  } +/* a pair of input pin and its sequence */ +struct auto_out_pin { +	hda_nid_t pin; +	short seq; +}; + +static int compare_seq(const void *ap, const void *bp) +{ +	const struct auto_out_pin *a = ap; +	const struct auto_out_pin *b = bp; +	return (int)(a->seq - b->seq); +}  /*   * Sort an associated group of pins according to their sequence numbers. + * then store it to a pin array.   */ -static void sort_pins_by_sequence(hda_nid_t *pins, short *sequences, +static void sort_pins_by_sequence(hda_nid_t *pins, struct auto_out_pin *list,  				  int num_pins)  { -	int i, j; -	short seq; -	hda_nid_t nid; - -	for (i = 0; i < num_pins; i++) { -		for (j = i + 1; j < num_pins; j++) { -			if (sequences[i] > sequences[j]) { -				seq = sequences[i]; -				sequences[i] = sequences[j]; -				sequences[j] = seq; -				nid = pins[i]; -				pins[i] = pins[j]; -				pins[j] = nid; -			} -		} -	} +	int i; +	sort(list, num_pins, sizeof(list[0]), compare_seq, NULL); +	for (i = 0; i < num_pins; i++) +		pins[i] = list[i].pin;  } @@ -67,21 +69,11 @@ static void add_auto_cfg_input_pin(struct auto_pin_cfg *cfg, hda_nid_t nid,  	}  } -/* sort inputs in the order of AUTO_PIN_* type */ -static void sort_autocfg_input_pins(struct auto_pin_cfg *cfg) +static int compare_input_type(const void *ap, const void *bp)  { -	int i, j; - -	for (i = 0; i < cfg->num_inputs; i++) { -		for (j = i + 1; j < cfg->num_inputs; j++) { -			if (cfg->inputs[i].type > cfg->inputs[j].type) { -				struct auto_pin_cfg_item tmp; -				tmp = cfg->inputs[i]; -				cfg->inputs[i] = cfg->inputs[j]; -				cfg->inputs[j] = tmp; -			} -		} -	} +	const struct auto_pin_cfg_item *a = ap; +	const struct auto_pin_cfg_item *b = bp; +	return (int)(a->type - b->type);  }  /* Reorder the surround channels @@ -129,16 +121,16 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  {  	hda_nid_t nid, end_nid;  	short seq, assoc_line_out; -	short sequences_line_out[ARRAY_SIZE(cfg->line_out_pins)]; -	short sequences_speaker[ARRAY_SIZE(cfg->speaker_pins)]; -	short sequences_hp[ARRAY_SIZE(cfg->hp_pins)]; +	struct auto_out_pin line_out[ARRAY_SIZE(cfg->line_out_pins)]; +	struct auto_out_pin speaker_out[ARRAY_SIZE(cfg->speaker_pins)]; +	struct auto_out_pin hp_out[ARRAY_SIZE(cfg->hp_pins)];  	int i;  	memset(cfg, 0, sizeof(*cfg)); -	memset(sequences_line_out, 0, sizeof(sequences_line_out)); -	memset(sequences_speaker, 0, sizeof(sequences_speaker)); -	memset(sequences_hp, 0, sizeof(sequences_hp)); +	memset(line_out, 0, sizeof(line_out)); +	memset(speaker_out, 0, sizeof(speaker_out)); +	memset(hp_out, 0, sizeof(hp_out));  	assoc_line_out = 0;  	end_nid = codec->start_nid + codec->num_nodes; @@ -184,8 +176,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  				continue;  			if (cfg->line_outs >= ARRAY_SIZE(cfg->line_out_pins))  				continue; -			cfg->line_out_pins[cfg->line_outs] = nid; -			sequences_line_out[cfg->line_outs] = seq; +			line_out[cfg->line_outs].pin = nid; +			line_out[cfg->line_outs].seq = seq;  			cfg->line_outs++;  			break;  		case AC_JACK_SPEAKER: @@ -193,8 +185,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  			assoc = get_defcfg_association(def_conf);  			if (cfg->speaker_outs >= ARRAY_SIZE(cfg->speaker_pins))  				continue; -			cfg->speaker_pins[cfg->speaker_outs] = nid; -			sequences_speaker[cfg->speaker_outs] = (assoc << 4) | seq; +			speaker_out[cfg->speaker_outs].pin = nid; +			speaker_out[cfg->speaker_outs].seq = (assoc << 4) | seq;  			cfg->speaker_outs++;  			break;  		case AC_JACK_HP_OUT: @@ -202,8 +194,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  			assoc = get_defcfg_association(def_conf);  			if (cfg->hp_outs >= ARRAY_SIZE(cfg->hp_pins))  				continue; -			cfg->hp_pins[cfg->hp_outs] = nid; -			sequences_hp[cfg->hp_outs] = (assoc << 4) | seq; +			hp_out[cfg->hp_outs].pin = nid; +			hp_out[cfg->hp_outs].seq = (assoc << 4) | seq;  			cfg->hp_outs++;  			break;  		case AC_JACK_MIC_IN: @@ -248,34 +240,28 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  		int i = 0;  		while (i < cfg->hp_outs) {  			/* The real HPs should have the sequence 0x0f */ -			if ((sequences_hp[i] & 0x0f) == 0x0f) { +			if ((hp_out[i].seq & 0x0f) == 0x0f) {  				i++;  				continue;  			}  			/* Move it to the line-out table */ -			cfg->line_out_pins[cfg->line_outs] = cfg->hp_pins[i]; -			sequences_line_out[cfg->line_outs] = sequences_hp[i]; -			cfg->line_outs++; +			line_out[cfg->line_outs++] = hp_out[i];  			cfg->hp_outs--; -			memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, -				sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); -			memmove(sequences_hp + i, sequences_hp + i + 1, -				sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); +			memmove(hp_out + i, hp_out + i + 1, +				sizeof(hp_out[0]) * (cfg->hp_outs - i));  		} -		memset(cfg->hp_pins + cfg->hp_outs, 0, -		       sizeof(hda_nid_t) * (AUTO_CFG_MAX_OUTS - cfg->hp_outs)); +		memset(hp_out + cfg->hp_outs, 0, +		       sizeof(hp_out[0]) * (AUTO_CFG_MAX_OUTS - cfg->hp_outs));  		if (!cfg->hp_outs)  			cfg->line_out_type = AUTO_PIN_HP_OUT;  	}  	/* sort by sequence */ -	sort_pins_by_sequence(cfg->line_out_pins, sequences_line_out, -			      cfg->line_outs); -	sort_pins_by_sequence(cfg->speaker_pins, sequences_speaker, +	sort_pins_by_sequence(cfg->line_out_pins, line_out, cfg->line_outs); +	sort_pins_by_sequence(cfg->speaker_pins, speaker_out,  			      cfg->speaker_outs); -	sort_pins_by_sequence(cfg->hp_pins, sequences_hp, -			      cfg->hp_outs); +	sort_pins_by_sequence(cfg->hp_pins, hp_out, cfg->hp_outs);  	/*  	 * FIX-UP: if no line-outs are detected, try to use speaker or HP pin @@ -304,7 +290,9 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,  	reorder_outputs(cfg->hp_outs, cfg->hp_pins);  	reorder_outputs(cfg->speaker_outs, cfg->speaker_pins); -	sort_autocfg_input_pins(cfg); +	/* sort inputs in the order of AUTO_PIN_* type */ +	sort(cfg->inputs, cfg->num_inputs, sizeof(cfg->inputs[0]), +	     compare_input_type, NULL);  	/*  	 * debug prints of the parsed results  |