From patchwork Wed Feb 25 21:54:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 5884341 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D99BCBF440 for ; Wed, 25 Feb 2015 21:54:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 463FA20304 for ; Wed, 25 Feb 2015 21:54:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3EBB120386 for ; Wed, 25 Feb 2015 21:54:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932364AbbBYVyQ (ORCPT ); Wed, 25 Feb 2015 16:54:16 -0500 Received: from galahad.ideasonboard.com ([185.26.127.97]:52086 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754129AbbBYVyP (ORCPT ); Wed, 25 Feb 2015 16:54:15 -0500 Received: from avalon.ideasonboard.com (dsl-hkibrasgw3-50ddcc-40.dhcp.inet.fi [80.221.204.40]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id 0820920BD3; Wed, 25 Feb 2015 22:53:24 +0100 (CET) From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Cc: linux-sh@vger.kernel.org Subject: [PATCH 24/38] drm: rcar-du: Rework CRTC enable/disable for atomic updates Date: Wed, 25 Feb 2015 23:54:44 +0200 Message-Id: <1424901298-6829-25-git-send-email-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.0.5 In-Reply-To: <1424901298-6829-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> References: <1424901298-6829-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When using atomic updates the CRTC .enable() and .disable() helper operations are preferred over the (then legacy) .prepare() and .commit() operations. Implement .enable() and rework .disable() to not depend on DPMS, easing DPMS removal later on. Signed-off-by: Laurent Pinchart --- drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 59 ++++++++++++++++++++-------------- drivers/gpu/drm/rcar-du/rcar_du_crtc.h | 2 +- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 6e7266c1a47b..7fdb968756ba 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c @@ -431,7 +431,7 @@ void rcar_du_crtc_suspend(struct rcar_du_crtc *rcrtc) void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc) { - if (rcrtc->dpms != DRM_MODE_DPMS_ON) + if (!rcrtc->enabled) return; rcar_du_crtc_get(rcrtc); @@ -450,25 +450,38 @@ static void rcar_du_crtc_update_base(struct rcar_du_crtc *rcrtc) * CRTC Functions */ -static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode) +static void rcar_du_crtc_enable(struct drm_crtc *crtc) { struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); - if (mode != DRM_MODE_DPMS_ON) - mode = DRM_MODE_DPMS_OFF; + if (rcrtc->enabled) + return; + + rcar_du_crtc_get(rcrtc); + rcar_du_crtc_start(rcrtc); + + rcrtc->enabled = true; +} + +static void rcar_du_crtc_disable(struct drm_crtc *crtc) +{ + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); - if (rcrtc->dpms == mode) + if (!rcrtc->enabled) return; - if (mode == DRM_MODE_DPMS_ON) { - rcar_du_crtc_get(rcrtc); - rcar_du_crtc_start(rcrtc); - } else { - rcar_du_crtc_stop(rcrtc); - rcar_du_crtc_put(rcrtc); - } + rcar_du_crtc_stop(rcrtc); + rcar_du_crtc_put(rcrtc); - rcrtc->dpms = mode; + rcrtc->enabled = false; +} + +static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + if (mode == DRM_MODE_DPMS_ON) + rcar_du_crtc_enable(crtc); + else + rcar_du_crtc_disable(crtc); } static bool rcar_du_crtc_mode_fixup(struct drm_crtc *crtc, @@ -488,10 +501,10 @@ static void rcar_du_crtc_mode_prepare(struct drm_crtc *crtc) */ rcar_du_crtc_get(rcrtc); - /* Stop the CRTC, force the DPMS mode to off as a result. */ + /* Stop the CRTC, force enabled to false as a result. */ rcar_du_crtc_stop(rcrtc); - rcrtc->dpms = DRM_MODE_DPMS_OFF; + rcrtc->enabled = false; rcrtc->outputs = 0; } @@ -508,17 +521,12 @@ static void rcar_du_crtc_mode_commit(struct drm_crtc *crtc) { struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); - /* We're done, restart the CRTC and set the DPMS mode to on. The - * reference to the DU acquired at prepare() time will thus be released - * by the DPMS handler (possibly called by the disable() handler). + /* We're done, restart the CRTC and set enabled to true. The reference + * to the DU acquired at prepare() time will thus be released by the + * disable() handler. */ rcar_du_crtc_start(rcrtc); - rcrtc->dpms = DRM_MODE_DPMS_ON; -} - -static void rcar_du_crtc_disable(struct drm_crtc *crtc) -{ - rcar_du_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); + rcrtc->enabled = true; } static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc) @@ -554,6 +562,7 @@ static const struct drm_crtc_helper_funcs crtc_helper_funcs = { .mode_set_nofb = rcar_du_crtc_mode_set_nofb, .mode_set_base = drm_helper_crtc_mode_set_base, .disable = rcar_du_crtc_disable, + .enable = rcar_du_crtc_enable, .atomic_begin = rcar_du_crtc_atomic_begin, .atomic_flush = rcar_du_crtc_atomic_flush, }; @@ -670,7 +679,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index) rcrtc->group = rgrp; rcrtc->mmio_offset = mmio_offsets[index]; rcrtc->index = index; - rcrtc->dpms = DRM_MODE_DPMS_OFF; + rcrtc->enabled = false; rcrtc->plane = &rgrp->planes.planes[index % 2]; rcrtc->plane->crtc = crtc; diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h index fb39e040f17b..f50fbafd609f 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h @@ -36,7 +36,7 @@ struct rcar_du_crtc { wait_queue_head_t flip_wait; unsigned int outputs; - int dpms; + bool enabled; struct rcar_du_group *group; struct rcar_du_plane *plane;