mirror of https://gitee.com/openkylin/linux.git
drm/nouveau/kms/gt215-: fix race with audio driver runpm
The audio driver can call into nouveau right while we're in the middle of re-fetching the EDID, and decide it no longer needs to be awake. Stop depending on EDID in the audio component get_eld() callback, and instead cache whether audio support is present from the prior modeset. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
a1ef8bad50
commit
0ad679d157
|
@ -510,7 +510,7 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id,
|
|||
if (!nv_connector || !nv_crtc || nv_encoder->or != port ||
|
||||
nv_crtc->index != dev_id)
|
||||
continue;
|
||||
*enabled = drm_detect_monitor_audio(nv_connector->edid);
|
||||
*enabled = nv_encoder->audio;
|
||||
if (*enabled) {
|
||||
ret = drm_eld_size(nv_connector->base.eld);
|
||||
memcpy(buf, nv_connector->base.eld,
|
||||
|
@ -600,6 +600,7 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc)
|
|||
(0x0100 << nv_crtc->index),
|
||||
};
|
||||
|
||||
nv_encoder->audio = false;
|
||||
nvif_mthd(&disp->disp->object, 0, &args, sizeof(args));
|
||||
|
||||
nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
|
||||
|
@ -636,6 +637,7 @@ nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)
|
|||
|
||||
nvif_mthd(&disp->disp->object, 0, &args,
|
||||
sizeof(args.base) + drm_eld_size(args.data));
|
||||
nv_encoder->audio = true;
|
||||
|
||||
nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
|
||||
nv_crtc->index);
|
||||
|
|
|
@ -52,6 +52,7 @@ struct nouveau_encoder {
|
|||
* actually programmed on the hw, not the proposed crtc */
|
||||
struct drm_crtc *crtc;
|
||||
u32 ctrl;
|
||||
bool audio;
|
||||
|
||||
struct drm_display_mode mode;
|
||||
int last_dpms;
|
||||
|
|
Loading…
Reference in New Issue