From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from perceval.ideasonboard.com ([213.167.242.64]:59414 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728076AbeINOYS (ORCPT ); Fri, 14 Sep 2018 10:24:18 -0400 From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Cc: linux-renesas-soc@vger.kernel.org, Ulrich Hecht , Kieran Bingham Subject: [PATCH v2 06/16] drm: rcar-du: Perform the initial CRTC setup from rcar_du_crtc_get() Date: Fri, 14 Sep 2018 12:10:36 +0300 Message-Id: <20180914091046.483-7-laurent.pinchart+renesas@ideasonboard.com> In-Reply-To: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> References: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: The rcar_du_crtc_get() function is always immediately followed by a call to rcar_du_crtc_setup(). Call the later from the former to simplify the code, and add a comment to explain how the get and put calls are balanced. Signed-off-by: Laurent Pinchart Tested-by: Jacopo Mondi --- drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 107 +++++++++++++++++---------------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 6288b9ad9e24..c89751c26f9c 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c @@ -66,39 +66,6 @@ static void rcar_du_crtc_clr_set(struct rcar_du_crtc *rcrtc, u32 reg, rcar_du_write(rcdu, rcrtc->mmio_offset + reg, (value & ~clr) | set); } -static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) -{ - int ret; - - ret = clk_prepare_enable(rcrtc->clock); - if (ret < 0) - return ret; - - ret = clk_prepare_enable(rcrtc->extclock); - if (ret < 0) - goto error_clock; - - ret = rcar_du_group_get(rcrtc->group); - if (ret < 0) - goto error_group; - - return 0; - -error_group: - clk_disable_unprepare(rcrtc->extclock); -error_clock: - clk_disable_unprepare(rcrtc->clock); - return ret; -} - -static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) -{ - rcar_du_group_put(rcrtc->group); - - clk_disable_unprepare(rcrtc->extclock); - clk_disable_unprepare(rcrtc->clock); -} - /* ----------------------------------------------------------------------------- * Hardware Setup */ @@ -546,6 +513,51 @@ static void rcar_du_crtc_setup(struct rcar_du_crtc *rcrtc) drm_crtc_vblank_on(&rcrtc->crtc); } +static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) +{ + int ret; + + /* + * Guard against double-get, as the function is called from both the + * .atomic_enable() and .atomic_begin() handlers. + */ + if (rcrtc->initialized) + return 0; + + ret = clk_prepare_enable(rcrtc->clock); + if (ret < 0) + return ret; + + ret = clk_prepare_enable(rcrtc->extclock); + if (ret < 0) + goto error_clock; + + ret = rcar_du_group_get(rcrtc->group); + if (ret < 0) + goto error_group; + + rcar_du_crtc_setup(rcrtc); + rcrtc->initialized = true; + + return 0; + +error_group: + clk_disable_unprepare(rcrtc->extclock); +error_clock: + clk_disable_unprepare(rcrtc->clock); + return ret; +} + +static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) +{ + rcar_du_group_put(rcrtc->group); + + clk_disable_unprepare(rcrtc->extclock); + clk_disable_unprepare(rcrtc->clock); + + rcrtc->initialized = false; +} + static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) { bool interlaced; @@ -639,16 +651,7 @@ static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc, { struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); - /* - * If the CRTC has already been setup by the .atomic_begin() handler we - * can skip the setup stage. - */ - if (!rcrtc->initialized) { - rcar_du_crtc_get(rcrtc); - rcar_du_crtc_setup(rcrtc); - rcrtc->initialized = true; - } - + rcar_du_crtc_get(rcrtc); rcar_du_crtc_start(rcrtc); } @@ -667,7 +670,6 @@ static void rcar_du_crtc_atomic_disable(struct drm_crtc *crtc, } spin_unlock_irq(&crtc->dev->event_lock); - rcrtc->initialized = false; rcrtc->outputs = 0; } @@ -680,14 +682,17 @@ static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc, /* * If a mode set is in progress we can be called with the CRTC disabled. - * We then need to first setup the CRTC in order to configure planes. - * The .atomic_enable() handler will notice and skip the CRTC setup. + * We thus need to first get and setup the CRTC in order to configure + * planes. We must *not* put the CRTC in .atomic_flush(), as it must be + * kept awake until the .atomic_enable() call that will follow. The get + * operation in .atomic_enable() will in that case be a no-op, and the + * CRTC will be put later in .atomic_disable(). + * + * If a mode set is not in progress the CRTC is enabled, and the + * following get call will be a no-op. There is thus no need to belance + * it in .atomic_flush() either. */ - if (!rcrtc->initialized) { - rcar_du_crtc_get(rcrtc); - rcar_du_crtc_setup(rcrtc); - rcrtc->initialized = true; - } + rcar_du_crtc_get(rcrtc); if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) rcar_du_vsp_atomic_begin(rcrtc); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: [PATCH v2 06/16] drm: rcar-du: Perform the initial CRTC setup from rcar_du_crtc_get() Date: Fri, 14 Sep 2018 12:10:36 +0300 Message-ID: <20180914091046.483-7-laurent.pinchart+renesas@ideasonboard.com> References: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id E8AB76E7FA for ; Fri, 14 Sep 2018 09:10:44 +0000 (UTC) In-Reply-To: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: linux-renesas-soc@vger.kernel.org, Ulrich Hecht , Kieran Bingham List-Id: dri-devel@lists.freedesktop.org VGhlIHJjYXJfZHVfY3J0Y19nZXQoKSBmdW5jdGlvbiBpcyBhbHdheXMgaW1tZWRpYXRlbHkgZm9s bG93ZWQgYnkgYSBjYWxsCnRvIHJjYXJfZHVfY3J0Y19zZXR1cCgpLiBDYWxsIHRoZSBsYXRlciBm cm9tIHRoZSBmb3JtZXIgdG8gc2ltcGxpZnkgdGhlCmNvZGUsIGFuZCBhZGQgYSBjb21tZW50IHRv IGV4cGxhaW4gaG93IHRoZSBnZXQgYW5kIHB1dCBjYWxscyBhcmUKYmFsYW5jZWQuCgpTaWduZWQt b2ZmLWJ5OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0K3JlbmVzYXNAaWRlYXNv bmJvYXJkLmNvbT4KVGVzdGVkLWJ5OiBKYWNvcG8gTW9uZGkgPGphY29wbytyZW5lc2FzQGptb25k aS5vcmc+Ci0tLQogZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgfCAxMDcg KysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNTYgaW5z ZXJ0aW9ucygrKSwgNTEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1 X2NydGMuYwppbmRleCA2Mjg4YjlhZDllMjQuLmM4OTc1MWMyNmY5YyAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJt L3JjYXItZHUvcmNhcl9kdV9jcnRjLmMKQEAgLTY2LDM5ICs2Niw2IEBAIHN0YXRpYyB2b2lkIHJj YXJfZHVfY3J0Y19jbHJfc2V0KHN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRjLCB1MzIgcmVnLAog CXJjYXJfZHVfd3JpdGUocmNkdSwgcmNydGMtPm1taW9fb2Zmc2V0ICsgcmVnLCAodmFsdWUgJiB+ Y2xyKSB8IHNldCk7CiB9CiAKLXN0YXRpYyBpbnQgcmNhcl9kdV9jcnRjX2dldChzdHJ1Y3QgcmNh cl9kdV9jcnRjICpyY3J0YykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5h YmxlKHJjcnRjLT5jbG9jayk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQg PSBjbGtfcHJlcGFyZV9lbmFibGUocmNydGMtPmV4dGNsb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJ Z290byBlcnJvcl9jbG9jazsKLQotCXJldCA9IHJjYXJfZHVfZ3JvdXBfZ2V0KHJjcnRjLT5ncm91 cCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfZ3JvdXA7Ci0KLQlyZXR1cm4gMDsKLQot ZXJyb3JfZ3JvdXA6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJjcnRjLT5leHRjbG9jayk7Ci1l cnJvcl9jbG9jazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUocmNydGMtPmNsb2NrKTsKLQlyZXR1 cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCByY2FyX2R1X2NydGNfcHV0KHN0cnVjdCByY2FyX2R1 X2NydGMgKnJjcnRjKQotewotCXJjYXJfZHVfZ3JvdXBfcHV0KHJjcnRjLT5ncm91cCk7Ci0KLQlj bGtfZGlzYWJsZV91bnByZXBhcmUocmNydGMtPmV4dGNsb2NrKTsKLQljbGtfZGlzYWJsZV91bnBy ZXBhcmUocmNydGMtPmNsb2NrKTsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhh cmR3YXJlIFNldHVwCiAgKi8KQEAgLTU0Niw2ICs1MTMsNTEgQEAgc3RhdGljIHZvaWQgcmNhcl9k dV9jcnRjX3NldHVwKHN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRjKQogCWRybV9jcnRjX3ZibGFu a19vbigmcmNydGMtPmNydGMpOwogfQogCitzdGF0aWMgaW50IHJjYXJfZHVfY3J0Y19nZXQoc3Ry dWN0IHJjYXJfZHVfY3J0YyAqcmNydGMpCit7CisJaW50IHJldDsKKworCS8qCisJICogR3VhcmQg YWdhaW5zdCBkb3VibGUtZ2V0LCBhcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYm90aCB0 aGUKKwkgKiAuYXRvbWljX2VuYWJsZSgpIGFuZCAuYXRvbWljX2JlZ2luKCkgaGFuZGxlcnMuCisJ ICovCisJaWYgKHJjcnRjLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjbGtf cHJlcGFyZV9lbmFibGUocmNydGMtPmNsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJl dDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShyY3J0Yy0+ZXh0Y2xvY2spOworCWlmIChy ZXQgPCAwKQorCQlnb3RvIGVycm9yX2Nsb2NrOworCisJcmV0ID0gcmNhcl9kdV9ncm91cF9nZXQo cmNydGMtPmdyb3VwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9ncm91cDsKKworCXJj YXJfZHVfY3J0Y19zZXR1cChyY3J0Yyk7CisJcmNydGMtPmluaXRpYWxpemVkID0gdHJ1ZTsKKwor CXJldHVybiAwOworCitlcnJvcl9ncm91cDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmNydGMt PmV4dGNsb2NrKTsKK2Vycm9yX2Nsb2NrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShyY3J0Yy0+ Y2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19wdXQo c3RydWN0IHJjYXJfZHVfY3J0YyAqcmNydGMpCit7CisJcmNhcl9kdV9ncm91cF9wdXQocmNydGMt Pmdyb3VwKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShyY3J0Yy0+ZXh0Y2xvY2spOworCWNs a19kaXNhYmxlX3VucHJlcGFyZShyY3J0Yy0+Y2xvY2spOworCisJcmNydGMtPmluaXRpYWxpemVk ID0gZmFsc2U7Cit9CisKIHN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19zdGFydChzdHJ1Y3QgcmNh cl9kdV9jcnRjICpyY3J0YykKIHsKIAlib29sIGludGVybGFjZWQ7CkBAIC02MzksMTYgKzY1MSw3 IEBAIHN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19hdG9taWNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YywKIHsKIAlzdHJ1Y3QgcmNhcl9kdV9jcnRjICpyY3J0YyA9IHRvX3JjYXJfY3J0Yyhj cnRjKTsKIAotCS8qCi0JICogSWYgdGhlIENSVEMgaGFzIGFscmVhZHkgYmVlbiBzZXR1cCBieSB0 aGUgLmF0b21pY19iZWdpbigpIGhhbmRsZXIgd2UKLQkgKiBjYW4gc2tpcCB0aGUgc2V0dXAgc3Rh Z2UuCi0JICovCi0JaWYgKCFyY3J0Yy0+aW5pdGlhbGl6ZWQpIHsKLQkJcmNhcl9kdV9jcnRjX2dl dChyY3J0Yyk7Ci0JCXJjYXJfZHVfY3J0Y19zZXR1cChyY3J0Yyk7Ci0JCXJjcnRjLT5pbml0aWFs aXplZCA9IHRydWU7Ci0JfQotCisJcmNhcl9kdV9jcnRjX2dldChyY3J0Yyk7CiAJcmNhcl9kdV9j cnRjX3N0YXJ0KHJjcnRjKTsKIH0KIApAQCAtNjY3LDcgKzY3MCw2IEBAIHN0YXRpYyB2b2lkIHJj YXJfZHVfY3J0Y19hdG9taWNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJfQogCXNw aW5fdW5sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrKTsKIAotCXJjcnRjLT5pbml0aWFs aXplZCA9IGZhbHNlOwogCXJjcnRjLT5vdXRwdXRzID0gMDsKIH0KIApAQCAtNjgwLDE0ICs2ODIs MTcgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV9jcnRjX2F0b21pY19iZWdpbihzdHJ1Y3QgZHJtX2Ny dGMgKmNydGMsCiAKIAkvKgogCSAqIElmIGEgbW9kZSBzZXQgaXMgaW4gcHJvZ3Jlc3Mgd2UgY2Fu IGJlIGNhbGxlZCB3aXRoIHRoZSBDUlRDIGRpc2FibGVkLgotCSAqIFdlIHRoZW4gbmVlZCB0byBm aXJzdCBzZXR1cCB0aGUgQ1JUQyBpbiBvcmRlciB0byBjb25maWd1cmUgcGxhbmVzLgotCSAqIFRo ZSAuYXRvbWljX2VuYWJsZSgpIGhhbmRsZXIgd2lsbCBub3RpY2UgYW5kIHNraXAgdGhlIENSVEMg c2V0dXAuCisJICogV2UgdGh1cyBuZWVkIHRvIGZpcnN0IGdldCBhbmQgc2V0dXAgdGhlIENSVEMg aW4gb3JkZXIgdG8gY29uZmlndXJlCisJICogcGxhbmVzLiBXZSBtdXN0ICpub3QqIHB1dCB0aGUg Q1JUQyBpbiAuYXRvbWljX2ZsdXNoKCksIGFzIGl0IG11c3QgYmUKKwkgKiBrZXB0IGF3YWtlIHVu dGlsIHRoZSAuYXRvbWljX2VuYWJsZSgpIGNhbGwgdGhhdCB3aWxsIGZvbGxvdy4gVGhlIGdldAor CSAqIG9wZXJhdGlvbiBpbiAuYXRvbWljX2VuYWJsZSgpIHdpbGwgaW4gdGhhdCBjYXNlIGJlIGEg bm8tb3AsIGFuZCB0aGUKKwkgKiBDUlRDIHdpbGwgYmUgcHV0IGxhdGVyIGluIC5hdG9taWNfZGlz YWJsZSgpLgorCSAqCisJICogSWYgYSBtb2RlIHNldCBpcyBub3QgaW4gcHJvZ3Jlc3MgdGhlIENS VEMgaXMgZW5hYmxlZCwgYW5kIHRoZQorCSAqIGZvbGxvd2luZyBnZXQgY2FsbCB3aWxsIGJlIGEg bm8tb3AuIFRoZXJlIGlzIHRodXMgbm8gbmVlZCB0byBiZWxhbmNlCisJICogaXQgaW4gLmF0b21p Y19mbHVzaCgpIGVpdGhlci4KIAkgKi8KLQlpZiAoIXJjcnRjLT5pbml0aWFsaXplZCkgewotCQly Y2FyX2R1X2NydGNfZ2V0KHJjcnRjKTsKLQkJcmNhcl9kdV9jcnRjX3NldHVwKHJjcnRjKTsKLQkJ cmNydGMtPmluaXRpYWxpemVkID0gdHJ1ZTsKLQl9CisJcmNhcl9kdV9jcnRjX2dldChyY3J0Yyk7 CiAKIAlpZiAocmNhcl9kdV9oYXMocmNydGMtPmdyb3VwLT5kZXYsIFJDQVJfRFVfRkVBVFVSRV9W U1AxX1NPVVJDRSkpCiAJCXJjYXJfZHVfdnNwX2F0b21pY19iZWdpbihyY3J0Yyk7Ci0tIApSZWdh cmRzLAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCg==