Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f7ca781 authored by Lyude Paul's avatar Lyude Paul Committed by Ben Skeggs
Browse files

drm/nouveau/drm/nouveau: Don't forget to cancel hpd_work on suspend/unload



Currently, there's nothing in nouveau that actually cancels this work
struct. So, cancel it on suspend/unload. Otherwise, if we're unlucky
enough hpd_work might try to keep running up until the system is
suspended.

Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 79e765ad
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ nouveau_display_init(struct drm_device *dev)
}

void
nouveau_display_fini(struct drm_device *dev, bool suspend)
nouveau_display_fini(struct drm_device *dev, bool suspend, bool runtime)
{
	struct nouveau_display *disp = nouveau_display(dev);
	struct nouveau_drm *drm = nouveau_drm(dev);
@@ -467,6 +467,9 @@ nouveau_display_fini(struct drm_device *dev, bool suspend)
	}
	drm_connector_list_iter_end(&conn_iter);

	if (!runtime)
		cancel_work_sync(&drm->hpd_work);

	drm_kms_helper_poll_disable(dev);
	disp->fini(dev);
}
@@ -635,11 +638,11 @@ nouveau_display_suspend(struct drm_device *dev, bool runtime)
			}
		}

		nouveau_display_fini(dev, true);
		nouveau_display_fini(dev, true, runtime);
		return 0;
	}

	nouveau_display_fini(dev, true);
	nouveau_display_fini(dev, true, runtime);

	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		struct nouveau_framebuffer *nouveau_fb;
+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ nouveau_display(struct drm_device *dev)
int  nouveau_display_create(struct drm_device *dev);
void nouveau_display_destroy(struct drm_device *dev);
int  nouveau_display_init(struct drm_device *dev);
void nouveau_display_fini(struct drm_device *dev, bool suspend);
void nouveau_display_fini(struct drm_device *dev, bool suspend, bool runtime);
int  nouveau_display_suspend(struct drm_device *dev, bool runtime);
void nouveau_display_resume(struct drm_device *dev, bool runtime);
int  nouveau_display_vblank_enable(struct drm_device *, unsigned int);
+1 −1
Original line number Diff line number Diff line
@@ -627,7 +627,7 @@ nouveau_drm_unload(struct drm_device *dev)
	nouveau_debugfs_fini(drm);

	if (dev->mode_config.num_crtc)
		nouveau_display_fini(dev, false);
		nouveau_display_fini(dev, false, false);
	nouveau_display_destroy(dev);

	nouveau_bios_takedown(dev);