Skip to content

Commit

Permalink
drm: rcar-du: Move group locking inside rcar_du_crtc_update_planes()
Browse files Browse the repository at this point in the history
Only the planes to CRTCs association control register DPTSR needs to be
protected by custom locking, don't hold the mutex around the whole code.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
  • Loading branch information
Laurent Pinchart committed Mar 3, 2015
1 parent 52055ba commit 48596d5
Showing 1 changed file with 3 additions and 7 deletions.
10 changes: 3 additions & 7 deletions drivers/gpu/drm/rcar-du/rcar_du_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,20 +252,20 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
* with superposition controller 2.
*/
if (rcrtc->index % 2) {
u32 value = rcar_du_group_read(rcrtc->group, DPTSR);

/* The DPTSR register is updated when the display controller is
* stopped. We thus need to restart the DU. Once again, sorry
* for the flicker. One way to mitigate the issue would be to
* pre-associate planes with CRTCs (either with a fixed 4/4
* split, or through a module parameter). Flicker would then
* occur only if we need to break the pre-association.
*/
if (value != dptsr) {
mutex_lock(&rcrtc->group->planes.lock);
if (rcar_du_group_read(rcrtc->group, DPTSR) != dptsr) {
rcar_du_group_write(rcrtc->group, DPTSR, dptsr);
if (rcrtc->group->used_crtcs)
rcar_du_group_restart(rcrtc->group);
}
mutex_unlock(&rcrtc->group->planes.lock);
}

rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR,
Expand Down Expand Up @@ -435,9 +435,7 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
rcar_du_plane_setup(plane);
}

mutex_lock(&rcrtc->group->planes.lock);
rcar_du_crtc_update_planes(rcrtc);
mutex_unlock(&rcrtc->group->planes.lock);
}

/* -----------------------------------------------------------------------------
Expand Down Expand Up @@ -501,9 +499,7 @@ static void rcar_du_crtc_atomic_flush(struct drm_crtc *crtc)
{
struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);

mutex_lock(&rcrtc->group->planes.lock);
rcar_du_crtc_update_planes(rcrtc);
mutex_unlock(&rcrtc->group->planes.lock);
}

static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
Expand Down

0 comments on commit 48596d5

Please sign in to comment.