From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: Conexant CX20588 breakage in Kernel 3.9 Date: Sat, 04 May 2013 11:00:53 +0200 Message-ID: References: Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id AD3342619E4 for ; Sat, 4 May 2013 11:00:46 +0200 (CEST) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: "Christopher K." Cc: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org At Sat, 4 May 2013 00:56:10 +0200, Christopher K. wrote: > > Works great, thanks for the help! OK, now applied. Thanks for a quick test. Takashi > > > On Fri, May 3, 2013 at 4:58 PM, Takashi Iwai wrote: > > > At Fri, 3 May 2013 15:51:20 +0200, > > Christopher K. wrote: > > > > > > Hi, > > > > > > Kernel 3.9 breaks audio on internal speakers for the Conexant CX20588. > > > EAPD is disabled for Node 0x1d. Enabling in hda_analyzer works fine. > > > > > > Someone already postet on > > > https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1173618 > > > > > > Is this the right place to report this bug? > > > > The kernel bugzilla or in alsa-devel ML, at best with Cc to > > maintainer. > > > > Does the patch below fix your problem? If so, I'll queue it to the > > upstream and Cc to stable kernel. > > > > > > thanks, > > > > Takashi > > > > --- > > diff --git a/sound/pci/hda/patch_conexant.c > > b/sound/pci/hda/patch_conexant.c > > index 84b81c8..e08cd33 100644 > > --- a/sound/pci/hda/patch_conexant.c > > +++ b/sound/pci/hda/patch_conexant.c > > @@ -63,6 +63,7 @@ struct conexant_spec { > > > > /* extra EAPD pins */ > > unsigned int num_eapds; > > + bool dynamic_eapd; > > hda_nid_t eapds[4]; > > > > #ifdef ENABLE_CXT_STATIC_QUIRKS > > @@ -3155,7 +3156,7 @@ static void cx_auto_parse_eapd(struct hda_codec > > *codec) > > * thus it might control over all pins. > > */ > > if (spec->num_eapds > 2) > > - spec->gen.own_eapd_ctl = 1; > > + spec->dynamic_eapd = 1; > > } > > > > static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins, > > @@ -3194,10 +3195,19 @@ static int cx_auto_build_controls(struct hda_codec > > *codec) > > return 0; > > } > > > > +static int cx_auto_init(struct hda_codec *codec) > > +{ > > + struct conexant_spec *spec = codec->spec; > > + snd_hda_gen_init(codec); > > + if (!spec->dynamic_eapd) > > + cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, > > true); > > + return 0; > > +} > > + > > static const struct hda_codec_ops cx_auto_patch_ops = { > > .build_controls = cx_auto_build_controls, > > .build_pcms = snd_hda_gen_build_pcms, > > - .init = snd_hda_gen_init, > > + .init = cx_auto_init, > > .free = snd_hda_gen_free, > > .unsol_event = snd_hda_jack_unsol_event, > > #ifdef CONFIG_PM > > @@ -3348,7 +3358,8 @@ static int patch_conexant_auto(struct hda_codec > > *codec) > > > > cx_auto_parse_beep(codec); > > cx_auto_parse_eapd(codec); > > - if (spec->gen.own_eapd_ctl) > > + spec->gen.own_eapd_ctl = 1; > > + if (spec->dynamic_eapd) > > spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook; > > > > switch (codec->vendor_id) { > > > [2 ] >