ALSA: hda/hdmi: Disable silent stream on GLK
The silent stream stuff recurses back into i915 audio
component .get_power() from the .pin_eld_notify() hook.
On GLK this will deadlock as i915 may already be holding
the relevant modeset locks during .pin_eld_notify() and
the GLK audio vs. CDCLK workaround will try to grab the
same locks from .get_power().
Until someone comes up with a better fix just disable the
silent stream support on GLK.
Cc: stable@vger.kernel.org
Cc: Harsha Priya <harshapriya.n@intel.com>
Cc: Emmanuel Jillela <emmanuel.jillela@intel.com>
Cc: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Cc: Takashi Iwai <tiwai@suse.de>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2623
Fixes: 951894cf30
("ALSA: hda/hdmi: Add Intel silent stream support")
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211222145350.24342-1-ville.syrjala@linux.intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
5dcdc4600c
Коммит
6c3a0c3913
|
@ -2947,7 +2947,8 @@ static int parse_intel_hdmi(struct hda_codec *codec)
|
|||
|
||||
/* Intel Haswell and onwards; audio component with eld notifier */
|
||||
static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
|
||||
const int *port_map, int port_num, int dev_num)
|
||||
const int *port_map, int port_num, int dev_num,
|
||||
bool send_silent_stream)
|
||||
{
|
||||
struct hdmi_spec *spec;
|
||||
int err;
|
||||
|
@ -2980,7 +2981,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
|
|||
* Enable silent stream feature, if it is enabled via
|
||||
* module param or Kconfig option
|
||||
*/
|
||||
if (enable_silent_stream)
|
||||
if (send_silent_stream)
|
||||
spec->send_silent_stream = true;
|
||||
|
||||
return parse_intel_hdmi(codec);
|
||||
|
@ -2988,12 +2989,18 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
|
|||
|
||||
static int patch_i915_hsw_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
return intel_hsw_common_init(codec, 0x08, NULL, 0, 3);
|
||||
return intel_hsw_common_init(codec, 0x08, NULL, 0, 3,
|
||||
enable_silent_stream);
|
||||
}
|
||||
|
||||
static int patch_i915_glk_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
return intel_hsw_common_init(codec, 0x0b, NULL, 0, 3);
|
||||
/*
|
||||
* Silent stream calls audio component .get_power() from
|
||||
* .pin_eld_notify(). On GLK this will deadlock in i915 due
|
||||
* to the audio vs. CDCLK workaround.
|
||||
*/
|
||||
return intel_hsw_common_init(codec, 0x0b, NULL, 0, 3, false);
|
||||
}
|
||||
|
||||
static int patch_i915_icl_hdmi(struct hda_codec *codec)
|
||||
|
@ -3004,7 +3011,8 @@ static int patch_i915_icl_hdmi(struct hda_codec *codec)
|
|||
*/
|
||||
static const int map[] = {0x0, 0x4, 0x6, 0x8, 0xa, 0xb};
|
||||
|
||||
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 3);
|
||||
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 3,
|
||||
enable_silent_stream);
|
||||
}
|
||||
|
||||
static int patch_i915_tgl_hdmi(struct hda_codec *codec)
|
||||
|
@ -3016,7 +3024,8 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec)
|
|||
static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
|
||||
int ret;
|
||||
|
||||
ret = intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 4);
|
||||
ret = intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 4,
|
||||
enable_silent_stream);
|
||||
if (!ret) {
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче