[QUANTAL PATCH] ALSA: hda - use both input paths on Conexant auto parser

Colin Ian King colin.king at canonical.com
Sat Oct 6 12:30:55 UTC 2012


David,

This patch unfortunately breaks audio on my Lenovo ThinkPad x230. I 
reverted the patch and then audio works again.  :-/

Colin

On 26/09/12 09:55, David Henningsson wrote:
> On the Thinkpad W520 - and probably several other machines with
> Conexant 506x chips - the Dock Mic and Mic are connected to the
> same two selector nodes. This patch will make Dock Mic take one
> selector node and Mic take the other, when possible.
>
> Without the patch, both paths would take the first selector,
> leading to the normal Mic's volume being controlled by
> "Dock Mic Boost".
> (On other machines, this could instead fixup similar problems between
> Mic and Line In, for example.)
>
> BugLink: https://bugs.launchpad.net/bugs/1037642
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> (cherry picked from commit 739572a545b8ab6faf9e266c3ed83ea202073699,
>   linux/kernel/git/tiwai/sound.git)
>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>
> Motivation:
>   * Bug tagged with regression-release
>   * Takashi did not want to send to stable because it renames some mixer element
>     (change of behaviour). Since we haven't released 12.10 yet, that argument does
>     not apply to us.
>
>   sound/pci/hda/patch_conexant.c |   20 ++++++++++++++++----
>   1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
> index 41f28c8..0c127cf 100644
> --- a/sound/pci/hda/patch_conexant.c
> +++ b/sound/pci/hda/patch_conexant.c
> @@ -3545,8 +3545,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:
> @@ -3570,14 +3571,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;
>





More information about the kernel-team mailing list