Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp5771197imm; Tue, 12 Jun 2018 13:04:26 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI6q1zatsNIf9ZnE3RGsgFSBTuJBryOEzAnr4h3yo6fm1cCQZMRGT/2m6CdTAVv8V9bBgmZ X-Received: by 2002:a17:902:8685:: with SMTP id g5-v6mr1937576plo.180.1528833866241; Tue, 12 Jun 2018 13:04:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528833866; cv=none; d=google.com; s=arc-20160816; b=Vmu3GjgMLC+3lFLC9rXk0KThSNo+9PfwY9QKo7O04oqoJjkPzwjf8TqjqOiTWtk7JZ zc/wQaW/BDskdDkbV3p7kTqYrDNumudgCZAXPnSnuwPUaoJS9acB1OQxRubcwuOUgYFT vtP3l+Cs40Z78xx0BYVEU7PIrqrPoBC26y6cg2qhDr0P/StbYhE2zYWAttqNCKbhFAdG aNVauWOSRO27M/FyOY6f7T9sberZ5bPOURfY4S5UHO6Nk6FNuI3G+l/pJI3JJkoEkvY0 iSl0ujZiz0xgi1QJG8StXFoNG5W9MNnkyTd6qWS7t8qLjSgdsn7lwnFJEiNh+5gc0E3h hTOg== 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=hA7fTCYNCOdI5q1duePJDFAAGKxNEOmA2UnBgfiTfZY=; b=ty4SyL24aZxnfrZfyvhc2YRlbla4+DGX3/2dJwd8aKp1Z2GIgQVDtmmsjLFW5tQ8pY vvK91Gg38WK91Rvt/EGn5rU/aCYG23y1qn3upgpk57xvtNPpjCr1CBgkesidJQIpE70T QygF9QLAV72EMCrf+1a/RazuLcqfDl2uePamVlL14zWuPK48Yn8cieH2FQlp1ZGQ8KcK TMzMlEfY+mueYsrqQ+VOoaOd37O29MN/apAHjM+CqRZA6A05rtad6HJ7BXlflvpYJG1s uGzqY4sb0IhliGFeWwiQnQH9rABuLqJFr+oIZgRDFMh02kWLqXOhZzdzbsKxlTbmWbiA kxWA== 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 r6-v6si874408pfl.260.2018.06.12.13.04.11; Tue, 12 Jun 2018 13:04:26 -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 S934650AbeFLUC5 (ORCPT + 99 others); Tue, 12 Jun 2018 16:02:57 -0400 Received: from mailoutvs51.siol.net ([185.57.226.242]:38885 "EHLO mail.siol.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934592AbeFLUCy (ORCPT ); Tue, 12 Jun 2018 16:02:54 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTP id 79D4C521ED2; Tue, 12 Jun 2018 22:02:52 +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 BzYHxasOysi1; Tue, 12 Jun 2018 22:02:51 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTPS id D9B43521279; Tue, 12 Jun 2018 22:02:51 +0200 (CEST) Received: from localhost.localdomain (unknown [194.152.15.144]) (Authenticated sender: 031275009) by mail.siol.net (Zimbra) with ESMTPSA id 58AA0522020; Tue, 12 Jun 2018 22:02:49 +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 25/27] drm/sun4i: DW HDMI: Expand algorithm for possible crtcs Date: Tue, 12 Jun 2018 22:00:34 +0200 Message-Id: <20180612200036.21483-26-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 drm_of_find_possible_crtcs() doesn't work when DW HDMI encoder is connected to TCON (crtc) through mux in TCON TOP. In that case TCON TOP HDMI mux input port has to be manually traversed and checked if it matches any known crtc. Signed-off-by: Jernej Skrabec --- drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 46 ++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c index 9f40a44b456b..d443886e055b 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c @@ -12,6 +12,7 @@ #include #include "sun8i_dw_hdmi.h" +#include "sun8i_tcon_top.h" static void sun8i_dw_hdmi_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, @@ -41,6 +42,48 @@ sun8i_dw_hdmi_mode_valid(struct drm_connector *connector, return MODE_OK; } +static bool sun8i_dw_hdmi_node_is_tcon_top(struct device_node *node) +{ + return !!of_match_node(sun8i_tcon_top_of_table, node); +} + +static u32 sun8i_dw_hdmi_find_possible_crtcs(struct drm_device *drm, + struct device_node *node) +{ + struct device_node *port, *ep, *remote, *remote_port; + u32 crtcs = 0; + + port = of_graph_get_port_by_id(node, 0); + if (!port) + return 0; + + ep = of_get_next_available_child(port, NULL); + if (!ep) + return 0; + + remote = of_graph_get_remote_port_parent(ep); + if (!remote) + return 0; + + if (sun8i_dw_hdmi_node_is_tcon_top(remote)) { + port = of_graph_get_port_by_id(remote, 4); + if (!port) + return 0; + + for_each_child_of_node(port, ep) { + remote_port = of_graph_get_remote_port(ep); + if (remote_port) { + crtcs |= drm_crtc_port_mask(drm, remote_port); + of_node_put(remote_port); + } + } + } else { + crtcs = drm_of_find_possible_crtcs(drm, node); + } + + return crtcs; +} + static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, void *data) { @@ -63,7 +106,8 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, hdmi->dev = &pdev->dev; encoder = &hdmi->encoder; - encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node); + encoder->possible_crtcs = + sun8i_dw_hdmi_find_possible_crtcs(drm, dev->of_node); /* * If we failed to find the CRTC(s) which this encoder is * supposed to be connected to, it's because the CRTC has -- 2.17.1