Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp5774080imm; Tue, 12 Jun 2018 13:07:19 -0700 (PDT) X-Google-Smtp-Source: ADUXVKILNKPazhDuYv78ebssvIra272gUlWL2vc6Oai631UGvDfwJkTksYOJiUO44o0m6akVIqJ6 X-Received: by 2002:a17:902:5a87:: with SMTP id r7-v6mr1928839pli.78.1528834039355; Tue, 12 Jun 2018 13:07:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528834039; cv=none; d=google.com; s=arc-20160816; b=Z8QQlYm0XxtWZFVg6/x/hfgK/pLNJgOUtqy+3ifLEZlhYx+46uzcP9U51LjMJ4wxBa ZQJ8yiYATyvwz4ENgqquz6/zM0zrAWbzwIvfUMyXtGZug1Fpkv7bKM8AMzfA9T86eXUv XosNk2/THcmskdzwfBc2M5v8XcJ/v+yGzFt0AmW78jQpuynhsdvhnLacvdsnnBLTNnZu tQguYoc2wUFMtOh64V0nRKdxAmnlI290sT/eh16Oyurn206ysqu0aR8RYsbR8SIb6MYW tTXcpW3LeGEjLgDpkeejav1kLtVH7FnDWVrHok+Y3XZ3lz/tzHJmFlZfq48YP2VU9os7 yISw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=qwEBSYQLtQG6Hd17ck6t69WZl61AkI/pAFgIYF5smlM=; b=qfTkZSb3aNIahwcIQYR6j6cSPij6EGvOakyESqWORB8QRuQv45Gv63Kc5LQPybiRsL a+jmjCuikGntBm9kuja4uJF5GWEdf5Tv79ajlHyxQqU5T/076nVlX4O/r3Nnn3l2Syre PCwtT5Gktde5CLIlRWJnXvBowRFHnJodwUmFRpWMDAP38xYkDJ6savtk9LUfH+Iu0SHO 6vfXAvNfN9dc5YuoiSquezFG+y+MmYzEZkKdHXLNuRr1GkW2u+ml79KSTnz5ULUzS+WS mADDCehxNZQbiPsyOFbryZHGo7/5ZZS6uHPzuSatMX+oVGsssgxBqo0/q1+bGPnTGY3W Rwyw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x2-v6si923464plr.223.2018.06.12.13.07.05; Tue, 12 Jun 2018 13:07:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934331AbeFLUCZ (ORCPT + 99 others); Tue, 12 Jun 2018 16:02:25 -0400 Received: from mailoutvs51.siol.net ([185.57.226.242]:38513 "EHLO mail.siol.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934283AbeFLUCV (ORCPT ); Tue, 12 Jun 2018 16:02:21 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTP id E538B521ED2; Tue, 12 Jun 2018 22:02:18 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta12.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta12.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id 4DliIx12CIZl; Tue, 12 Jun 2018 22:02:18 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTPS id 649E3521DC5; Tue, 12 Jun 2018 22:02:18 +0200 (CEST) Received: from localhost.localdomain (unknown [194.152.15.144]) (Authenticated sender: 031275009) by mail.siol.net (Zimbra) with ESMTPSA id D8231521ED2; Tue, 12 Jun 2018 22:02:15 +0200 (CEST) From: Jernej Skrabec To: maxime.ripard@bootlin.com, wens@csie.org, robh+dt@kernel.org Cc: airlied@linux.ie, gustavo@padovan.org, maarten.lankhorst@linux.intel.com, seanpaul@chromium.org, mark.rutland@arm.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-sunxi@googlegroups.com Subject: [PATCH v2 12/27] drm/sun4i: tcon: Generalize engine search algorithm Date: Tue, 12 Jun 2018 22:00:21 +0200 Message-Id: <20180612200036.21483-13-jernej.skrabec@siol.net> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180612200036.21483-1-jernej.skrabec@siol.net> References: <20180612200036.21483-1-jernej.skrabec@siol.net> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Current "old" method to find engine worked pretty well for DE2. However, it doesn't work when TCON TOP is between mixer (engine) and TCON. TCON TOP has multiple input ports, but current engine search algorithm expects only one. This can be fixed by first looking for output port id and selecting matching input by subtracting 1 for the next round. This work even if there is only one input and output. Signed-off-by: Jernej Skrabec --- drivers/gpu/drm/sun4i/sun4i_tcon.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index 0afb5a94a414..5dae623968f7 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c @@ -802,12 +802,14 @@ static int sun4i_tcon_init_regmap(struct device *dev, */ static struct sunxi_engine * sun4i_tcon_find_engine_traverse(struct sun4i_drv *drv, - struct device_node *node) + struct device_node *node, + u32 port_id) { struct device_node *port, *ep, *remote; struct sunxi_engine *engine = ERR_PTR(-EINVAL); + u32 reg = 0; - port = of_graph_get_port_by_id(node, 0); + port = of_graph_get_port_by_id(node, port_id); if (!port) return ERR_PTR(-EINVAL); @@ -837,8 +839,20 @@ sun4i_tcon_find_engine_traverse(struct sun4i_drv *drv, if (remote == engine->node) goto out_put_remote; + /* + * According to device tree binding input ports have even id + * number and output ports have odd id. Since component with + * more than one input and one output (TCON TOP) exits, correct + * remote input id has to be calculated by subtracting 1 from + * remote output id. If this for some reason can't be done, 0 + * is used as input port id. + */ + port = of_graph_get_remote_port(ep); + if (!of_property_read_u32(port, "reg", ®) && reg > 0) + reg -= 1; + /* keep looking through upstream ports */ - engine = sun4i_tcon_find_engine_traverse(drv, remote); + engine = sun4i_tcon_find_engine_traverse(drv, remote, reg); out_put_remote: of_node_put(remote); @@ -961,7 +975,7 @@ static struct sunxi_engine *sun4i_tcon_find_engine(struct sun4i_drv *drv, /* Fallback to old method by traversing input endpoints */ of_node_put(port); - return sun4i_tcon_find_engine_traverse(drv, node); + return sun4i_tcon_find_engine_traverse(drv, node, 0); } static int sun4i_tcon_bind(struct device *dev, struct device *master, -- 2.17.1