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

Commit 2ee5d8ad authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: queue vblank work on disp thread during modeset"

parents c5328d54 7ba450fa
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -323,6 +323,8 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
					int crtc_id, bool enable)
{
	struct vblank_work *cur_work;
	struct drm_crtc *crtc;
	struct kthread_worker *worker;

	if (!priv || crtc_id >= priv->num_crtcs)
		return -EINVAL;
@@ -331,14 +333,23 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
	if (!cur_work)
		return -ENOMEM;

	crtc = priv->crtcs[crtc_id];

	kthread_init_work(&cur_work->work, vblank_ctrl_worker);
	cur_work->crtc_id = crtc_id;
	cur_work->enable = enable;
	cur_work->priv = priv;

	kthread_queue_work(&priv->event_thread[crtc_id].worker,
						&cur_work->work);
	/* During modeset scenario, vblank request is queued to
	 * display thread to avoid enabling irq resulting in
	 * vblank refcount mismatch
	 */
	if (crtc->state && drm_atomic_crtc_needs_modeset(crtc->state))
		worker = &priv->disp_thread[crtc_id].worker;
	else
		worker = &priv->event_thread[crtc_id].worker;

	kthread_queue_work(worker, &cur_work->work);
	return 0;
}