[PATCH] [oneiric] fix sound output on acer aspire 3830TG
Andy Whitcroft
apw at canonical.com
Mon Aug 1 17:53:14 UTC 2011
On Mon, Aug 01, 2011 at 09:06:37AM +0200, David Henningsson wrote:
> The attached, cherrypicked patch is necessary for sound output to
> work on Acer Aspire 3830 TG. Please apply to Oneiric as this patch
> is originally scheduled for 3.1 upstream.
>
> http://bugs.launchpad.net/bugs/783582
>
> --
> David Henningsson, Canonical Ltd.
> http://launchpad.net/~diwic
> From cad167954afec0f961e1122907219c57e5e8e6d9 Mon Sep 17 00:00:00 2001
> From: Takashi Iwai <tiwai at suse.de>
> Date: Mon, 11 Jul 2011 14:46:44 +0200
> Subject: [PATCH] ALSA: hda - Turn on extra EAPDs on Conexant codecs
>
> Some machines seem to use EAPD control of the unused pin for controlling
> the overall EAPD. Since the driver currently doesn't check the EAPD of
> unused pins, the EAPD isn't enabled. For avoiding such a problem, turn
> all extra EAPDs on as default.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> (cherry picked from commit 19110595c89b2d606883b7cb99260c7e47fd2143)
>
> BugLink: http://bugs.launchpad.net/bugs/783582
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
> sound/pci/hda/patch_conexant.c | 39 +++++++++++++++++++++++++++++++++++++++
> 1 files changed, 39 insertions(+), 0 deletions(-)
>
> diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
> index 1ab6663..f32682b 100644
> --- a/sound/pci/hda/patch_conexant.c
> +++ b/sound/pci/hda/patch_conexant.c
> @@ -155,6 +155,10 @@ struct conexant_spec {
> unsigned int mic_boost; /* offset into cxt5066_analog_mic_boost */
>
> unsigned int beep_amp;
> +
> + /* extra EAPD pins */
> + unsigned int num_eapds;
> + hda_nid_t eapds[4];
> };
>
> static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo,
> @@ -3911,6 +3915,38 @@ static void cx_auto_parse_beep(struct hda_codec *codec)
> #define cx_auto_parse_beep(codec)
> #endif
>
> +static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
> +{
> + int i;
> + for (i = 0; i < nums; i++)
> + if (list[i] == nid)
> + return true;
> + return false;
> +}
> +
> +/* parse extra-EAPD that aren't assigned to any pins */
> +static void cx_auto_parse_eapd(struct hda_codec *codec)
> +{
> + struct conexant_spec *spec = codec->spec;
> + struct auto_pin_cfg *cfg = &spec->autocfg;
> + hda_nid_t nid, end_nid;
> +
> + end_nid = codec->start_nid + codec->num_nodes;
> + for (nid = codec->start_nid; nid < end_nid; nid++) {
> + if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
> + continue;
> + if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD))
> + continue;
> + if (found_in_nid_list(nid, cfg->line_out_pins, cfg->line_outs) ||
> + found_in_nid_list(nid, cfg->hp_pins, cfg->hp_outs) ||
> + found_in_nid_list(nid, cfg->speaker_pins, cfg->speaker_outs))
> + continue;
> + spec->eapds[spec->num_eapds++] = nid;
> + if (spec->num_eapds >= ARRAY_SIZE(spec->eapds))
> + break;
> + }
> +}
> +
> static int cx_auto_parse_auto_config(struct hda_codec *codec)
> {
> struct conexant_spec *spec = codec->spec;
> @@ -3924,6 +3960,7 @@ static int cx_auto_parse_auto_config(struct hda_codec *codec)
> cx_auto_parse_input(codec);
> cx_auto_parse_digital(codec);
> cx_auto_parse_beep(codec);
> + cx_auto_parse_eapd(codec);
> return 0;
> }
>
> @@ -4011,6 +4048,8 @@ static void cx_auto_init_output(struct hda_codec *codec)
> }
> }
> cx_auto_update_speakers(codec);
> + /* turn on/off extra EAPDs, too */
> + cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true);
> }
>
> static void cx_auto_init_input(struct hda_codec *codec)
Gah Vile. I'd probabally have liked to see a diagnostic when the eapd
array is full. But if its what upstream are doing in 3.1, then i guess:
Acked-by: Andy Whitcroft <apw at canonical.com>
-apw
More information about the kernel-team
mailing list