From patchwork Fri Jan 12 07:48:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 124348 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp2070974qgn; Fri, 12 Jan 2018 05:37:29 -0800 (PST) X-Google-Smtp-Source: ACJfBotD7xthvZ8A9tzTmDJpcgyf6uAn9CLUUqOIbaP2Ln0ACM1cGZbkS4lsrCnmWeYQOc2xCCdm X-Received: by 10.159.246.139 with SMTP id c11mr13883456pls.446.1515764249248; Fri, 12 Jan 2018 05:37:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515764249; cv=none; d=google.com; s=arc-20160816; b=dp1iPe6ex42HOqr4046jKF5o8dQIpvDrxItePfk96JLdGZHXOdQnrTk4qIhq6X6TRF fU5ay+GDtQCsVZRNbDwV7I9HTpzzE2bWm/ysNJJWO8COdjjdCAtGFvufZhBusg2CDxbO r98lCk+XTQsDMphyLcyFkntTa7m7uU3MXHLnwps08cVyhgkKHL/htUppyDK340QaNQ9L jqR3l4W89jOdUD+6cnY3rjG09p7ESrQmsqUw8AxT7jDbRNJEt+kpjVt7o3Xq96iiF8yW Y6phV23KiLXQ5ekuod6259kMJyzm/is9jgiOpFTNULOth6FrkNmJZWTD4cZUU1XYwIqz R+PQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:cc:references:in-reply-to:message-id:date :subject:to:from:dkim-signature:delivered-to :arc-authentication-results; bh=qAuKxgbLoApp6A30owVc0E4V2rqHW+m02Tps/3cVKtk=; b=VvKAGdxTHuhQAizcmGSDJdL7grtRq/xufE2i/AjhXhl7zjZRKPczW2CohfcvSEBCDj 3UMlU/076VGEL8f0yiLZo8aqoQdaMl9/xPru6/q1Hb2RTijxqfFAMHXXZ/ByqxwPnE3N uRAPdZFgxv3xQ1BkIhevfXsSZqYEOoO3Z8x+qnKdUsPMac0tULt2kCNdKlDI53JvKXyV b9GXb9pg40RJnGdFJrMIohukvD3tO5AjpqwwzQ1gVWz5vQHQRzAo7GJiYPPgnYnZVXw5 WRkq+rfuW7RJo/IebWHt+unuOsJJ8LgH/uFYfUr0MqiqHZMZY0egg3cK/JWIzgQDnS2o kfFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=VqHzIkkx; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from gabe.freedesktop.org (gabe.freedesktop.org. [131.252.210.177]) by mx.google.com with ESMTPS id e6si13606257pgt.433.2018.01.12.05.37.28 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 12 Jan 2018 05:37:29 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) client-ip=131.252.210.177; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=VqHzIkkx; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AB2C06E465; Fri, 12 Jan 2018 13:36:50 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9A1B76E465 for ; Fri, 12 Jan 2018 13:36:49 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id e27so5960651lfb.9 for ; Fri, 12 Jan 2018 05:36:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ASSHfNSUSdXOtpJv5I5qkS027oV67ukgjxUMbiDhEcU=; b=VqHzIkkx6n0jpzwcYOgM2+/OyWGPhmnYey5HsSOP9p3ri532rUyqCoiwBT99z0EilC XvOFMUewoihSMH7peBTbZ9TddJCtGvGxXtSrq/fw1PZeJQgbS8hOxWfVdrbjf3C0MuHw mF0Y+DIC9Uo5cG0dKJgOSmDNpjapB7P0k7tjQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ASSHfNSUSdXOtpJv5I5qkS027oV67ukgjxUMbiDhEcU=; b=lONGPbMnh2YXJlrAjy93eclS6DVKZHv34kQ24ICLhes0XBOWtLn6jBT3fTVgZwnjal jsWwxrnLLCjfryHgmrx98y+s504bfhiIReV//c1f5baMGj3jUAr3IayeuTDUTt1l36kM jpldWONtu57OY3ZxLMMEwuZeigoyh0rypm4iTR07twomiVZbNBx97kQMt10QavZHwxY2 OrzrYKeK3hDrF7f8C8er3sIJ8zTh5Q4ga1sKx7ohCRdM1DJ+g5t6hK/dql6TcyehZe1q SOvNQemFN92IPRDj3E8ftebJKLbx5IrkjdcEUNQ42Yn0rXcq1GuDvIiQb1xj1Ea/cy2O oWfw== X-Gm-Message-State: AKwxyteU/rNcLyMugpdVq4G5RkfkunkdLDpocLOdXNfDR2pcpZLl3+c7 Z/MnmBlzYjZr/2GnJFc1ne35+wzj2S4= X-Received: by 10.25.92.135 with SMTP id u7mr10465703lfi.36.1515743610375; Thu, 11 Jan 2018 23:53:30 -0800 (PST) Received: from localhost.localdomain (c-cb7471d5.014-348-6c756e10.cust.bredbandsbolaget.se. [213.113.116.203]) by smtp.gmail.com with ESMTPSA id a69sm4115039ljf.54.2018.01.11.23.53.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 11 Jan 2018 23:53:29 -0800 (PST) From: Linus Walleij To: Archit Taneja , Andrzej Hajda , Laurent Pinchart Subject: [PATCH 4/4 v7] drm/pl111: Support handling bridge timings Date: Fri, 12 Jan 2018 08:48:54 +0100 Message-Id: <20180112074854.9560-4-linus.walleij@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180112074854.9560-1-linus.walleij@linaro.org> References: <20180112074854.9560-1-linus.walleij@linaro.org> Cc: linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" If the bridge has a too strict setup time for the incoming signals, we may not be fast enough and then we need to compensate by outputting the signal on the inverse clock edge so it is for sure stable when the bridge samples it. Since bridges in difference to panels does not expose their connectors, make the connector optional in the display setup code. Acked-by: Laurent Pinchart Reviewed-by: Eric Anholt Signed-off-by: Linus Walleij --- ChangeLog v6->v7: - Collect Eric's ACK. ChangeLog v5->v6: - Collect Laurent's ACK. ChangeLog v4->v5: - Use the new bridge timings setup method. --- drivers/gpu/drm/pl111/Kconfig | 1 + drivers/gpu/drm/pl111/pl111_display.c | 35 +++++++++++++++++++++++++++++++---- drivers/gpu/drm/pl111/pl111_drv.c | 20 +++++++++++--------- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/pl111/Kconfig b/drivers/gpu/drm/pl111/Kconfig index e5e2abd66491..82cb3e60ddc8 100644 --- a/drivers/gpu/drm/pl111/Kconfig +++ b/drivers/gpu/drm/pl111/Kconfig @@ -8,6 +8,7 @@ config DRM_PL111 select DRM_GEM_CMA_HELPER select DRM_BRIDGE select DRM_PANEL_BRIDGE + select DRM_DUMB_VGA_DAC select VT_HW_CONSOLE_BINDING if FRAMEBUFFER_CONSOLE help Choose this option for DRM support for the PL111 CLCD controller. diff --git a/drivers/gpu/drm/pl111/pl111_display.c b/drivers/gpu/drm/pl111/pl111_display.c index 06c4bf756b69..7fe4040aea46 100644 --- a/drivers/gpu/drm/pl111/pl111_display.c +++ b/drivers/gpu/drm/pl111/pl111_display.c @@ -94,6 +94,7 @@ static void pl111_display_enable(struct drm_simple_display_pipe *pipe, const struct drm_display_mode *mode = &cstate->mode; struct drm_framebuffer *fb = plane->state->fb; struct drm_connector *connector = priv->connector; + struct drm_bridge *bridge = priv->bridge; u32 cntl; u32 ppl, hsw, hfp, hbp; u32 lpp, vsw, vfp, vbp; @@ -143,11 +144,37 @@ static void pl111_display_enable(struct drm_simple_display_pipe *pipe, if (mode->flags & DRM_MODE_FLAG_NVSYNC) tim2 |= TIM2_IVS; - if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW) - tim2 |= TIM2_IOE; + if (connector) { + if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW) + tim2 |= TIM2_IOE; - if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE) - tim2 |= TIM2_IPC; + if (connector->display_info.bus_flags & + DRM_BUS_FLAG_PIXDATA_NEGEDGE) + tim2 |= TIM2_IPC; + } + + if (bridge) { + const struct drm_bridge_timings *btimings = bridge->timings; + + /* + * Here is when things get really fun. Sometimes the bridge + * timings are such that the signal out from PL11x is not + * stable before the receiving bridge (such as a dumb VGA DAC + * or similar) samples it. If that happens, we compensate by + * the only method we have: output the data on the opposite + * edge of the clock so it is for sure stable when it gets + * sampled. + * + * The PL111 manual does not contain proper timining diagrams + * or data for these details, but we know from experiments + * that the setup time is more than 3000 picoseconds (3 ns). + * If we have a bridge that requires the signal to be stable + * earlier than 3000 ps before the clock pulse, we have to + * output the data on the opposite edge to avoid flicker. + */ + if (btimings && btimings->setup_time_ps >= 3000) + tim2 ^= TIM2_IPC; + } tim2 |= cpl << 16; writel(tim2, priv->regs + CLCD_TIM2); diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c index 201d57d5cb54..101a9c7db6ff 100644 --- a/drivers/gpu/drm/pl111/pl111_drv.c +++ b/drivers/gpu/drm/pl111/pl111_drv.c @@ -107,11 +107,17 @@ static int pl111_modeset_init(struct drm_device *dev) ret = PTR_ERR(bridge); goto out_config; } - /* - * TODO: when we are using a different bridge than a panel - * (such as a dumb VGA connector) we need to devise a different - * method to get the connector out of the bridge. - */ + } else if (bridge) { + dev_info(dev->dev, "Using non-panel bridge\n"); + } else { + dev_err(dev->dev, "No bridge, exiting\n"); + return -ENODEV; + } + + priv->bridge = bridge; + if (panel) { + priv->panel = panel; + priv->connector = panel->connector; } ret = pl111_display_init(dev); @@ -125,10 +131,6 @@ static int pl111_modeset_init(struct drm_device *dev) if (ret) return ret; - priv->bridge = bridge; - priv->panel = panel; - priv->connector = panel->connector; - ret = drm_vblank_init(dev, 1); if (ret != 0) { dev_err(dev->dev, "Failed to init vblank\n");