From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fabio Estevam Subject: [PATCH RESEND] drm: mxsfb_crtc: Reset the eLCDIF controller Date: Mon, 22 May 2017 17:53:47 -0300 Message-ID: <1495486427-8213-1-git-send-email-festevam@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qk0-x243.google.com (mail-qk0-x243.google.com [IPv6:2607:f8b0:400d:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 522A76E2A6 for ; Mon, 22 May 2017 20:54:00 +0000 (UTC) Received: by mail-qk0-x243.google.com with SMTP id k74so20594628qke.2 for ; Mon, 22 May 2017 13:54:00 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: daniel@ffwll.ch Cc: marex@denx.de, Fabio Estevam , "#4 . 11 . x" , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org RnJvbTogRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBueHAuY29tPgoKQWNjb3JkaW5nIHRv IHRoZSBlTENESUYgaW5pdGlhbGl6YXRpb24gc3RlcHMgbGlzdGVkIGluIHRoZSBNWDZTWApSZWZl cmVuY2UgTWFudWFsIHRoZSBlTENESUYgYmxvY2sgcmVzZXQgaXMgbWFuZGF0b3J5LiAKCldpdGhv dXQgcGVyZm9ybWluZyB0aGUgZUxDRElGIHJlc2V0IHRoZSBkaXNwbGF5IHNob3dzIGdhcmJhZ2Ug Y29udGVudAp3aGVuIHRoZSBrZXJuZWwgYm9vdHMuCgpJbiBlYXJsaWVyIHRlc3RzIHRoaXMgaXNz dWUgaGFzIG5vdCBiZWVuIG9ic2VydmVkIGJlY2F1c2UgdGhlIGJvb3Rsb2FkZXIKd2FzIHByZXZp b3VzbHkgc2hvd2luZyBhIHNwbGFzaCBzY3JlZW4gYW5kIHRoZSBib290bG9hZGVyIGRpc3BsYXkg ZHJpdmVyCmRvZXMgcHJvcGVybHkgaW1wbGVtZW50IHRoZSBlTENESUYgcmVzZXQuCgpBZGQgdGhl IGVMQ0RJRiByZXNldCB0byB0aGUgZHJpdmVyLCBzbyB0aGF0IGl0IGNhbiBvcGVyYXRlIGNvcnJl Y3RseQppbmRlcGVuZGVudGx5IG9mIHRoZSBib290bG9hZGVyLgoKVGVzdGVkIG9uIGEgaW14NnN4 LXNkYiBib2FyZC4KCkNjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIzQuMTEueApTaWduZWQt b2ZmLWJ5OiBGYWJpbyBFc3RldmFtIDxmYWJpby5lc3RldmFtQG54cC5jb20+ClJldmlld2VkLWJ5 OiBNYXJlayBWYXN1dCA8bWFyZXhAZGVueC5kZT4KLS0tCkRhbmllbCwKCk1hcmVrIHN1Z2dlc3Rl ZCB0aGF0IHRoaXMgZ29lcyB2aWEgZHJtLW1pc2MuCgpUaGFua3MKCiBkcml2ZXJzL2dwdS9kcm0v bXhzZmIvbXhzZmJfY3J0Yy5jIHwgNDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIDEgZmlsZSBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL214c2ZiL214c2ZiX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9teHNmYi9t eHNmYl9jcnRjLmMKaW5kZXggMTE0NGUwYy4uMGFiZTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL214c2ZiL214c2ZiX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXhzZmIvbXhz ZmJfY3J0Yy5jCkBAIC0zNSw2ICszNSwxMyBAQAogI2luY2x1ZGUgIm14c2ZiX2Rydi5oIgogI2lu Y2x1ZGUgIm14c2ZiX3JlZ3MuaCIKIAorI2RlZmluZSBNWFNfU0VUX0FERFIJCTB4NAorI2RlZmlu ZSBNWFNfQ0xSX0FERFIJCTB4OAorI2RlZmluZSBNT0RVTEVfQ0xLR0FURQkJQklUKDMwKQorI2Rl ZmluZSBNT0RVTEVfU0ZUUlNUCQlCSVQoMzEpCisvKiAxIHNlY29uZCBkZWxheSBzaG91bGQgYmUg cGxlbnR5IG9mIHRpbWUgZm9yIGJsb2NrIHJlc2V0ICovCisjZGVmaW5lIFJFU0VUX1RJTUVPVVQJ CTEwMDAwMDAKKwogc3RhdGljIHUzMiBzZXRfaHN5bmNfcHVsc2Vfd2lkdGgoc3RydWN0IG14c2Zi X2RybV9wcml2YXRlICpteHNmYiwgdTMyIHZhbCkKIHsKIAlyZXR1cm4gKHZhbCAmIG14c2ZiLT5k ZXZkYXRhLT5oc193ZHRoX21hc2spIDw8CkBAIC0xNTksNiArMTY2LDM2IEBAIHN0YXRpYyB2b2lk IG14c2ZiX2Rpc2FibGVfY29udHJvbGxlcihzdHJ1Y3QgbXhzZmJfZHJtX3ByaXZhdGUgKm14c2Zi KQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUobXhzZmItPmNsa19kaXNwX2F4aSk7CiB9CiAKKy8q CisgKiBDbGVhciB0aGUgYml0IGFuZCBwb2xsIGl0IGNsZWFyZWQuICBUaGlzIGlzIHVzdWFsbHkg Y2FsbGVkIHdpdGgKKyAqIGEgcmVzZXQgYWRkcmVzcyBhbmQgbWFzayBiZWluZyBlaXRoZXIgU0ZU UlNUKGJpdCAzMSkgb3IgQ0xLR0FURQorICogKGJpdCAzMCkuCisgKi8KK3N0YXRpYyBpbnQgY2xl YXJfcG9sbF9iaXQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgbWFzaykKK3sKKwl1MzIgcmVnOwor CisJd3JpdGVsKG1hc2ssIGFkZHIgKyBNWFNfQ0xSX0FERFIpOworCXJldHVybiByZWFkbF9wb2xs X3RpbWVvdXQoYWRkciwgcmVnLCAhKHJlZyAmIG1hc2spLCAwLCBSRVNFVF9USU1FT1VUKTsKK30K Kworc3RhdGljIGludCBteHNmYl9yZXNldF9ibG9jayh2b2lkIF9faW9tZW0gKnJlc2V0X2FkZHIp Cit7CisJaW50IHJldDsKKworCXJldCA9IGNsZWFyX3BvbGxfYml0KHJlc2V0X2FkZHIsIE1PRFVM RV9TRlRSU1QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3cml0ZWwoTU9EVUxFX0NM S0dBVEUsIHJlc2V0X2FkZHIgKyBNWFNfQ0xSX0FERFIpOworCisJcmV0ID0gY2xlYXJfcG9sbF9i aXQocmVzZXRfYWRkciwgTU9EVUxFX1NGVFJTVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCXJldHVybiBjbGVhcl9wb2xsX2JpdChyZXNldF9hZGRyLCBNT0RVTEVfQ0xLR0FURSk7Cit9 CisKIHN0YXRpYyB2b2lkIG14c2ZiX2NydGNfbW9kZV9zZXRfbm9mYihzdHJ1Y3QgbXhzZmJfZHJt X3ByaXZhdGUgKm14c2ZiKQogewogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptID0gJm14c2Zi LT5waXBlLmNydGMuc3RhdGUtPmFkanVzdGVkX21vZGU7CkBAIC0xNzMsNiArMjEwLDExIEBAIHN0 YXRpYyB2b2lkIG14c2ZiX2NydGNfbW9kZV9zZXRfbm9mYihzdHJ1Y3QgbXhzZmJfZHJtX3ByaXZh dGUgKm14c2ZiKQogCSAqLwogCW14c2ZiX2VuYWJsZV9heGlfY2xrKG14c2ZiKTsKIAorCS8qIE1h bmRhdG9yeSBlTENESUYgcmVzZXQgYXMgcGVyIHRoZSBSZWZlcmVuY2UgTWFudWFsICovCisJZXJy ID0gbXhzZmJfcmVzZXRfYmxvY2sobXhzZmItPmJhc2UpOworCWlmIChlcnIpCisJCXJldHVybjsK KwogCS8qIENsZWFyIHRoZSBGSUZPcyAqLwogCXdyaXRlbChDVFJMMV9GSUZPX0NMRUFSLCBteHNm Yi0+YmFzZSArIExDRENfQ1RSTDEgKyBSRUdfU0VUKTsKIAotLSAKMi43LjQKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk0-f193.google.com ([209.85.220.193]:33321 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752436AbdEVUyA (ORCPT ); Mon, 22 May 2017 16:54:00 -0400 Received: by mail-qk0-f193.google.com with SMTP id o85so20554276qkh.0 for ; Mon, 22 May 2017 13:54:00 -0700 (PDT) From: Fabio Estevam To: daniel@ffwll.ch Cc: marex@denx.de, dri-devel@lists.freedesktop.org, Fabio Estevam , "#4 . 11 . x" Subject: [PATCH RESEND] drm: mxsfb_crtc: Reset the eLCDIF controller Date: Mon, 22 May 2017 17:53:47 -0300 Message-Id: <1495486427-8213-1-git-send-email-festevam@gmail.com> Sender: stable-owner@vger.kernel.org List-ID: From: Fabio Estevam According to the eLCDIF initialization steps listed in the MX6SX Reference Manual the eLCDIF block reset is mandatory. Without performing the eLCDIF reset the display shows garbage content when the kernel boots. In earlier tests this issue has not been observed because the bootloader was previously showing a splash screen and the bootloader display driver does properly implement the eLCDIF reset. Add the eLCDIF reset to the driver, so that it can operate correctly independently of the bootloader. Tested on a imx6sx-sdb board. Cc: #4.11.x Signed-off-by: Fabio Estevam Reviewed-by: Marek Vasut --- Daniel, Marek suggested that this goes via drm-misc. Thanks drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c index 1144e0c..0abe776 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c @@ -35,6 +35,13 @@ #include "mxsfb_drv.h" #include "mxsfb_regs.h" +#define MXS_SET_ADDR 0x4 +#define MXS_CLR_ADDR 0x8 +#define MODULE_CLKGATE BIT(30) +#define MODULE_SFTRST BIT(31) +/* 1 second delay should be plenty of time for block reset */ +#define RESET_TIMEOUT 1000000 + static u32 set_hsync_pulse_width(struct mxsfb_drm_private *mxsfb, u32 val) { return (val & mxsfb->devdata->hs_wdth_mask) << @@ -159,6 +166,36 @@ static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb) clk_disable_unprepare(mxsfb->clk_disp_axi); } +/* + * Clear the bit and poll it cleared. This is usually called with + * a reset address and mask being either SFTRST(bit 31) or CLKGATE + * (bit 30). + */ +static int clear_poll_bit(void __iomem *addr, u32 mask) +{ + u32 reg; + + writel(mask, addr + MXS_CLR_ADDR); + return readl_poll_timeout(addr, reg, !(reg & mask), 0, RESET_TIMEOUT); +} + +static int mxsfb_reset_block(void __iomem *reset_addr) +{ + int ret; + + ret = clear_poll_bit(reset_addr, MODULE_SFTRST); + if (ret) + return ret; + + writel(MODULE_CLKGATE, reset_addr + MXS_CLR_ADDR); + + ret = clear_poll_bit(reset_addr, MODULE_SFTRST); + if (ret) + return ret; + + return clear_poll_bit(reset_addr, MODULE_CLKGATE); +} + static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) { struct drm_display_mode *m = &mxsfb->pipe.crtc.state->adjusted_mode; @@ -173,6 +210,11 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) */ mxsfb_enable_axi_clk(mxsfb); + /* Mandatory eLCDIF reset as per the Reference Manual */ + err = mxsfb_reset_block(mxsfb->base); + if (err) + return; + /* Clear the FIFOs */ writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_SET); -- 2.7.4