APPLIED G: [F/G/Unstable/OEM-5.6] [PATCH 3/3] UBUNTU: SAUCE: ALSA: hda: fix jack detection with Realtek codecs when in D3

Andrea Righi andrea.righi at canonical.com
Tue Oct 13 13:24:21 UTC 2020


On Tue, Oct 13, 2020 at 03:53:55PM +0800, Kai-Heng Feng wrote:
> From: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1899586
> 
> In case HDA controller becomes active, but codec is runtime suspended,
> jack detection is not successful and no interrupt is raised. This has
> been observed with multiple Realtek codecs and HDA controllers from
> different vendors. Bug does not occur if both codec and controller are
> active, or both are in suspend. Bug can be easily hit on desktop systems
> with no built-in speaker.
> 
> The problem can be fixed by powering up the codec once after every
> controller runtime resume. Even if codec goes back to suspend later, the
> jack detection will continue to work. Add a flag to 'hda_codec' to
> describe codecs that require this flow from the controller driver.
> Modify __azx_runtime_resume() to use pm_request_resume() to make the
> intent clearer.
> 
> Mark all Realtek codecs with the new forced_resume flag.
> 
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=209379
> Cc: Kailang Yang <kailang at realtek.com>
> Co-developed-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
> Signed-off-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> Cc: <stable at vger.kernel.org>
> Link: https://lore.kernel.org/r/20201012102704.794423-1-kai.vehmanen@linux.intel.com
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> (cherry picked from commit a6e7d0a4bdb02a7a3ffe0b44aaa8842b7efdd056 git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git master)
> Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
> ---
>  include/sound/hda_codec.h     |  1 +
>  sound/pci/hda/hda_intel.c     | 14 ++++++++------
>  sound/pci/hda/patch_realtek.c |  1 +
>  3 files changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h
> index 225154a4f2ed..b4d112e40ae7 100644
> --- a/include/sound/hda_codec.h
> +++ b/include/sound/hda_codec.h
> @@ -253,6 +253,7 @@ struct hda_codec {
>  	unsigned int force_pin_prefix:1; /* Add location prefix */
>  	unsigned int link_down_at_suspend:1; /* link down at runtime suspend */
>  	unsigned int relaxed_resume:1;	/* don't resume forcibly for jack */
> +	unsigned int forced_resume:1; /* forced resume for jack */
>  	unsigned int mst_no_extra_pcms:1; /* no backup PCMs for DP-MST */
>  
>  #ifdef CONFIG_PM
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 35c7d5bad1bc..16c66aa4d381 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1002,12 +1002,14 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt)
>  	azx_init_pci(chip);
>  	hda_intel_init_chip(chip, true);
>  
> -	if (status && from_rt) {
> -		list_for_each_codec(codec, &chip->bus)
> -			if (!codec->relaxed_resume &&
> -			    (status & (1 << codec->addr)))
> -				schedule_delayed_work(&codec->jackpoll_work,
> -						      codec->jackpoll_interval);
> +	if (from_rt) {
> +		list_for_each_codec(codec, &chip->bus) {
> +			if (codec->relaxed_resume)
> +				continue;
> +
> +			if (codec->forced_resume || (status & (1 << codec->addr)))
> +				pm_request_resume(hda_codec_dev(codec));
> +		}
>  	}
>  
>  	/* power down again for link-controlled chips */
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index b44219859d82..9b635ae01b6c 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -1150,6 +1150,7 @@ static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
>  	codec->single_adc_amp = 1;
>  	/* FIXME: do we need this for all Realtek codec models? */
>  	codec->spdif_status_reset = 1;
> +	codec->forced_resume = 1;
>  	codec->patch_ops = alc_patch_ops;
>  
>  	err = alc_codec_rename_from_preset(codec);
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list