From patchwork Thu Feb 1 12:55:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 126533 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp1681178ljc; Thu, 1 Feb 2018 04:56:05 -0800 (PST) X-Google-Smtp-Source: AH8x224RkhN2XH29QHzczRNCwOuEb+ZDtKiSBKS7vVglUxizG986zgGSk+fIWCfMIShP/JILwJwi X-Received: by 10.98.16.79 with SMTP id y76mr36905037pfi.111.1517489765182; Thu, 01 Feb 2018 04:56:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517489765; cv=none; d=google.com; s=arc-20160816; b=Wh33ApEFrQ3dmXmknFkwJTHAMzOLkmvisduooDMTg73jOUTO+PJoLBVUaCX1tzTKCJ mPoxKAl0aWnSDSoffMDsr3+gjIftRqOrcGXrmIp/YKHv1NDrk86N2/LInrzKzxNVjL9c fOYKywg9HAaOUiMy81YJC9+CgJ1H8JWdfsKEv9cXSVeYvbGn33SnjaoX6/NcPu2ThabZ qetl/M0d3veCCr+9Zc4GQy9TqZMRc/ErxiZ4KWVA+Tnd85OQRwaeckOfNL88+yFPj0si LeIx48T9GN1Z3ciWjMvGKuyuankvbiktUIpL0zVM4gqBykQFuM+8KTLE8D5s1nlTk0md 0EoA== 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:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:references:in-reply-to:message-id:date:subject :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=1uR+nBOsWAEx0wGP/Xg2IYAf548O7Ee6Lig1sU/OnDY=; b=hCoKxiKYFQVHGU9DWR2+ABZh5E2EXge3nECFAZ7VjlW4g2WzmJbZ0DnrMwPD89rpA2 hGr4YEzG5T7BkejEcqfVKLJsQApMmtdhyVoUNu/F2rdqD+zmM28q1CGPCWmR1RoYXav1 kFZErVDdgraB7dpD5z8B8ozKW/QXSKIHWos8985I5dT5IfPtdLTW6kwnIuWVv7AO3txp dUt8oRt4pHc7g25rDCXKW4BvKFG9bHrPIr/nit88KaVNyKNCvecD6gY0yp7lqtBu1ISy GWVusAYzjKH6WfhKzm1RDeG/WYIKK0PqFHmpDdXpAA+QcsqBThgEuDc2Oqej8LskPd8A zvOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ITqipfh4; 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 x2si5200132pgb.36.2018.02.01.04.56.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Feb 2018 04:56:05 -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=ITqipfh4; 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 7BCCD6EDA8; Thu, 1 Feb 2018 12:55:31 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x243.google.com (mail-lf0-x243.google.com [IPv6:2a00:1450:4010:c07::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD8ED6EDA8 for ; Thu, 1 Feb 2018 12:55:29 +0000 (UTC) Received: by mail-lf0-x243.google.com with SMTP id q17so26036180lfa.9 for ; Thu, 01 Feb 2018 04:55:29 -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=wg20Qc1+jW+E9wLoViexCx2Y+tp0PmU10GBE/Anloow=; b=ITqipfh40eMpt63aP49EWrJwZNYtlK/X3hg5QIZ7soWXaCTbVT8SyX1ZaEYw0HsRvo j9oarMm54N+roNh8fv/BpmAoEiQNQY/74C1ZEZEytigVhRChSTzmqjWWM2yGZszzFpiP M9Nu1BHu9L72XFaFg+E37eosBIjCbssbxuowA= 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=wg20Qc1+jW+E9wLoViexCx2Y+tp0PmU10GBE/Anloow=; b=DrK/pFuMOtCHLd40FKSQAXBwEvIwX52K99fc5iC2xQaW12Kqci4L06CtlWgwPmlppV 00zMfdaMNpT6wJRKExoVFHDndeg+LabieTVuoxr24dMPLSJEx2ZGpIfphx/iztuwaqZD yn4V3L3RTmfDSdDdEEHmhWguMRnTYEmllE4S97UkdyTer+8ozUa8Je7bTuBq/kiffphk A1fzA/yfSdLQtoaJigtq2xsZTD9KRHofj7LdmUoWX3NprukkCvGVokfeKFdWxiP2Ywlt yw5WoNPrt+q+xOakudHeI4T/uaHu01QsdzCH0tFk0FNSEL5T9xqP4O7DL7RkQEN+6Vcr H4Jg== X-Gm-Message-State: AKwxyteGH2YUHesRF3fuJQ0f4bhpFdJgsW86kKVIvZnwS1KQc9V6Uhfv NA/4GsTl+qvcWEZR5ySaBf7oZh0VwWU= X-Received: by 10.46.114.2 with SMTP id n2mr1306387ljc.99.1517489728098; Thu, 01 Feb 2018 04:55:28 -0800 (PST) Received: from genomnajs.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id a129sm4300792lfa.0.2018.02.01.04.55.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Feb 2018 04:55:27 -0800 (PST) From: Linus Walleij To: Daniel Vetter , Jani Nikula , Sean Paul , Eric Anholt Subject: [PATCH 5/5 v2] drm/pl111: Support multiple endpoints on the CLCD Date: Thu, 1 Feb 2018 13:55:13 +0100 Message-Id: <20180201125513.5482-6-linus.walleij@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180201125513.5482-1-linus.walleij@linaro.org> References: <20180201125513.5482-1-linus.walleij@linaro.org> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The Versatile PL110 implementations use multiple endpoints: from the PL111 port, the lines are routed through a PLD, and from there forked so the same lines go to a VGA DAC and an external TFT panel connector. This is discrete wireing so there is no way to turn of one output, i.e. this is really two endpoints, not two ports. We model this with multiple endpoints, so we need to loop over the available endpoints, check for panel or bridge on each and accumulate the result before continuing. The code already will give the panel preference over the bridge, if present, so the output will be sent to the panel if both a panel and a bridge is present on two endpoints of the same port. If they all return -EPROBE_DEFER we return -EPROBE_DEFER as well. If just one endpoint is present on the port, the behaviour is the same as before. Signed-off-by: Linus Walleij --- drivers/gpu/drm/pl111/pl111_drv.c | 62 +++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c index e6fa897c740c..221f3af02fb4 100644 --- a/drivers/gpu/drm/pl111/pl111_drv.c +++ b/drivers/gpu/drm/pl111/pl111_drv.c @@ -58,6 +58,8 @@ #include #include #include +#include +#include #include #include @@ -84,9 +86,13 @@ static int pl111_modeset_init(struct drm_device *dev) { struct drm_mode_config *mode_config; struct pl111_drm_dev_private *priv = dev->dev_private; - struct drm_panel *panel; - struct drm_bridge *bridge; + struct device_node *np = dev->dev->of_node; + struct device_node *remote; + struct drm_panel *panel = NULL; + struct drm_bridge *bridge = NULL; + bool defer = false; int ret = 0; + int i; drm_mode_config_init(dev); mode_config = &dev->mode_config; @@ -96,10 +102,54 @@ static int pl111_modeset_init(struct drm_device *dev) mode_config->min_height = 1; mode_config->max_height = 768; - ret = drm_of_find_panel_or_bridge(dev->dev->of_node, - 0, 0, &panel, &bridge); - if (ret && ret != -ENODEV) - return ret; + i = 0; + for_each_endpoint_of_node(np, remote) { + struct drm_panel *tmp_panel; + struct drm_bridge *tmp_bridge; + + dev_dbg(dev->dev, "checking endpoint %d\n", i); + + ret = drm_of_find_panel_or_bridge(dev->dev->of_node, + 0, i, + &tmp_panel, + &tmp_bridge); + if (ret) { + if (ret == -EPROBE_DEFER) { + /* + * Something deferred, but that is often just + * another way of saying -ENODEV, but let's + * cast a vote for later deferral. + */ + defer = true; + } else if (ret != -ENODEV) { + /* Continue, maybe something else is working */ + dev_err(dev->dev, + "endpoint %d returns %d\n", i, ret); + } + } + + if (tmp_panel) { + dev_info(dev->dev, + "found panel on endpoint %d\n", i); + panel = tmp_panel; + } + if (tmp_bridge) { + dev_info(dev->dev, + "found bridge on endpoint %d\n", i); + bridge = tmp_bridge; + } + + i++; + } + + /* + * If we can't find neither panel nor bridge on any of the + * endpoints, and any of them retured -EPROBE_DEFER, then + * let's defer this driver too. + */ + if ((!panel && !bridge) && defer) + return -EPROBE_DEFER; + if (panel) { bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_Unknown);