From patchwork Thu Jan 26 14:44:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 2674 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id CE5753F046 for ; Thu, 26 Jan 2023 15:45:09 +0100 (CET) Received: by mail-pj1-f70.google.com with SMTP id on9-20020a17090b1d0900b0022955c2f0f4sf3418355pjb.1 for ; Thu, 26 Jan 2023 06:45:09 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1674744308; cv=pass; d=google.com; s=arc-20160816; b=fr9wBiXnTsmjwrksjJUfm9CJOeffxtJBc8LNTglIsfb9p12lTJg179kKUELbpKuFgt RB2a7oOdNn1sKmrheVbURHZxvArONSsW5CDEsncXKNeQdqT0ydxIfDZsaythj2dkQWAU I6phP8vHk5pQGzkyGpIs+yHo584bJdM4BC3Y68FU2gc3UhuCANwmXMwy0N7hTqd3c/aZ EXr0eMLpfnvXWqlQN91/+qJYvh6QAGzHcejb+ELr9DSuV0a2lkBTwHBx4hodlUIOgL4a lANUuvPZl6W6hCzPKLGVJ0ks5yVy705nHq9UROTGS3+286KuQz+fzAuQK3L5ZWLKGWp2 w8yQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=i0D7m4QFBGK6WPGOXu24RYhoSakVrHvuyE2wum9rnzs=; b=OEL4n5BIcVuxrwmfrjCbn3x2xnz6llv4wYmh6lhMpKjhY+RpQW6m1OXJikeMvabKn4 3g3xy0FhQBWZwcGCWqe48ftV4rFKAt7xWN4HlVr/P5zKqnGHXs9u58eX46/cyu9p/KWe +r+AFy2vgakZeMaZi68YO+I1CqJ+29KXke4d9KongC7KqYUPfGHSn7u26ZzAjvS7h3Ta TcJLScK2zuqKWbIq8IY/pp+EMQn8qbTPvx2a3dMiQzqBkoy6jmXuyB6M87kH+GXPmhxL dJNq5T15VNW7ZowShjefcF4ag9w9xd/j244TtiQ51+VUM1GX98ib2dzzVbu9fOuKz4g/ VvGA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=InagqSKu; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=i0D7m4QFBGK6WPGOXu24RYhoSakVrHvuyE2wum9rnzs=; b=SKoJFbNuoIpzBcUtL6JhLqRT4YMx6HvpY6tlGX2WCEhU+lFTHVSPzyY9j3evzitDua UKrwd86eYIr9/Zy+eOkUDtfUj1a9ZVvtf3g6ik7462Th7uFw/79qgCXmN3b1hC/aspsF kPloBeSc2eqKny6bt5WGvSiXZqUdI7O0dZIoY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=i0D7m4QFBGK6WPGOXu24RYhoSakVrHvuyE2wum9rnzs=; b=gRE6zwj4kzh1cX7pxVV7IKi03tRRqMBr9o0WhGHvb33O9b6OsY8BgTI/qtbbw6Aya1 z6UC1A/zaIzAMtsd4OWkzRnMG/WRrO6tvY1H+BG4VSwM7UGHedPglBm68Y4PclgOfXvK lHC8WFBclZoaahP6gctOzbcyWjUCPzveK4QvSrgXasifDF8yqotNbke8iTn2T2IxlhJQ PVu75ioN0Gh6UWGs8MHJUVZWs8QyOGRfqqaTesSSSzCutGxeCvtRvi9X9x6Y+oVxVQt1 Dk/D+62fmOy5sSwkBQ4vOC8b1p/xFi1Jfwj17TCXlVp+VZkU3XCAtI2B/3guEOQTi3f/ Prvw== X-Gm-Message-State: AFqh2kpWrMB/euFHmHHt+O//dVhyRdiSLwMOrHNQ40irSEvvP6yFOzUi l3UA6R64FNIECKV7XJRsT/qIisOy X-Google-Smtp-Source: AMrXdXtNOAl9tbqIlwnglEMAQToYqeINs+XIfMQtWpmpf1yAo3Y3IZ5G88oygoYr3UA4KZw2dcIovw== X-Received: by 2002:a17:90b:2686:b0:226:eccc:1d65 with SMTP id pl6-20020a17090b268600b00226eccc1d65mr4898036pjb.41.1674744308483; Thu, 26 Jan 2023 06:45:08 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com Received: by 2002:a17:903:2312:b0:194:d87a:ffa6 with SMTP id d18-20020a170903231200b00194d87affa6ls2381757plh.1.-pod-prod-gmail; Thu, 26 Jan 2023 06:45:07 -0800 (PST) X-Received: by 2002:a17:902:7c8d:b0:194:9c02:6ea1 with SMTP id y13-20020a1709027c8d00b001949c026ea1mr33149662pll.0.1674744307461; Thu, 26 Jan 2023 06:45:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674744307; cv=none; d=google.com; s=arc-20160816; b=A+QubKw7ZsTCFzteDQ5x8xAQvOHlRqzPdmCCH0KIe6fHKJExHaU9i/owEV16XYi2iU feBPkUMbHBpGcMhKub2NGSDZBfgwBUiXoq/8yuTrO/Jpasx+gqpqP/svHaezMUqiqnb9 VEhegT4qLDyNqsnsIXm4SaYciUYhEjDbC7iATskqL9Fa5wKuVoqlIq90nrOqNF1UBpNK bhjOHoxgYeBuDTrOFfDGvHNTpgaKBQivdrS3hJ2OZTK58oc6Mo+o3kW7HBd7hYXR4O+E exiErqH/xwcOPkcUkMPmXO8cW4tpHK1V7Zx/65EbhQiXEqQIQiZoTm6pPTvq6vqLMWmY SUrw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=WK+2n5leeCN1ZUwhUDdriDW81kYnEsZfkVBz+dLgw2o=; b=uLJtl27kjDnzt68QV6MRNxup7yX/Jua/OLtpImPQEdkrJSsFnvQhPBLQRw2nQ219ns Jg8MWviRzNxPPihI7X9gWH3eYj1N+1+fyyZR161sjgwvqltAQh6eMHzHEYfl3mzZOTXX plOi+DpV/6zCDs14KOF3bHJT5gIisx4md0851OxLLun5cv5mDMFdgOzvVhNwS9SbvzcS sf5K7sOLA7fVMqslyZbS13aElOoImMGzdvbDD6tn4fWacju6e8fzjQyAOX4pv2l9QW7B lnNFJWuYDR32uxs3Z9RI4ReBsEIk2hkooexCUtwbsEPDvWuMgawcph9yWIzRBwrSNe6W 1GqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=InagqSKu; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id jj4-20020a170903048400b00194ab28325fsor671004plb.168.2023.01.26.06.45.07 for (Google Transport Security); Thu, 26 Jan 2023 06:45:07 -0800 (PST) Received-SPF: pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Received: by 2002:a17:90b:17cb:b0:22b:b9f4:4ad1 with SMTP id me11-20020a17090b17cb00b0022bb9f44ad1mr22793352pjb.34.1674744306993; Thu, 26 Jan 2023 06:45:06 -0800 (PST) Received: from localhost.localdomain ([2405:201:c00a:a238:3cb1:2156:ef87:8af5]) by smtp.gmail.com with ESMTPSA id d197-20020a6336ce000000b0042988a04bfdsm823660pga.9.2023.01.26.06.44.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jan 2023 06:45:06 -0800 (PST) From: Jagan Teki To: Andrzej Hajda , Inki Dae , Marek Szyprowski , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Tim Harvey , Adam Ford , Robert Foss , Laurent Pinchart , Marek Vasut Cc: Matteo Lisi , dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula , Jagan Teki , Maxime Ripard , Linus Walleij , Maarten Lankhorst Subject: [PATCH v12 01/18] drm: of: Lookup if child node has DSI panel or bridge Date: Thu, 26 Jan 2023 20:14:10 +0530 Message-Id: <20230126144427.607098-2-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230126144427.607098-1-jagan@amarulasolutions.com> References: <20230126144427.607098-1-jagan@amarulasolutions.com> MIME-Version: 1.0 X-Original-Sender: jagan@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=InagqSKu; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Devices can also be child nodes when we also control that device through the upstream device (ie, MIPI-DCS for a MIPI-DSI device). Unlike the drm_of_find_panel_or_bridge helper it requires a special case to lookup a child node of the given parent that isn't either port or ports. Lookup for a child DSI node of the given parent that isn't either port or ports. If it is found then it will directly find the panel or bridge otherwise lookup for the child node with a given port and endpoint number as drm_of_find_panel_or_bridge does. Supporting this feature via existing drm_of_find_panel_or_bridge found several issues while handling usecases. Here is the previously failed attempt of similar and the same has been reverted later. commit <80253168dbfd> ("drm: of: Lookup if child node has panel or bridge") So, add a separate helper to handle this DSI use case. Example OF graph representation of DSI host, which has port but not has ports and has child panel node. dsi { compatible = "allwinner,sun6i-a31-mipi-dsi"; #address-cells = <1>; #size-cells = <0>; port { dsi_in_tcon0: endpoint { remote-endpoint = ; }; panel@0 { reg = <0>; }; }; Example OF graph representation of DSI host, which has ports but not has port and has child panel node. dsi { compatible = "samsung,exynos5433-mipi-dsi"; #address-cells = <1>; #size-cells = <0>; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; dsi_to_mic: endpoint { remote-endpoint = <&mic_to_dsi>; }; }; }; panel@0 { reg = <0>; }; }; Example OF graph representation of DSI host, which has neither a port nor a ports but has child panel node. dsi0 { compatible = "ste,mcde-dsi"; #address-cells = <1>; #size-cells = <0>; panel@0 { reg = <0>; }; }; Cc: Maxime Ripard Cc: Laurent Pinchart Cc: Linus Walleij Cc: Maarten Lankhorst Signed-off-by: Jagan Teki --- Changes for v12: - none Changes for v11: - drop extra line Changes for v10: - new patch drivers/gpu/drm/drm_of.c | 112 ++++++++++++++++++++++++++++++++------- include/drm/drm_of.h | 12 +++++ 2 files changed, 104 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c index 7bbcb999bb75..e165951e3545 100644 --- a/drivers/gpu/drm/drm_of.c +++ b/drivers/gpu/drm/drm_of.c @@ -216,6 +216,35 @@ int drm_of_encoder_active_endpoint(struct device_node *node, } EXPORT_SYMBOL_GPL(drm_of_encoder_active_endpoint); +static int of_drm_find_panel_or_bridge(struct device_node *remote, + struct drm_panel **panel, + struct drm_bridge **bridge) +{ + int ret = -EPROBE_DEFER; + + if (panel) { + *panel = of_drm_find_panel(remote); + if (!IS_ERR(*panel)) + ret = 0; + else + *panel = NULL; + } + + /* No panel found yet, check for a bridge next. */ + if (bridge) { + if (ret) { + *bridge = of_drm_find_bridge(remote); + if (*bridge) + ret = 0; + } else { + *bridge = NULL; + } + } + + of_node_put(remote); + return ret; +} + /** * drm_of_find_panel_or_bridge - return connected panel or bridge device * @np: device tree node containing encoder output ports @@ -238,7 +267,6 @@ int drm_of_find_panel_or_bridge(const struct device_node *np, struct drm_panel **panel, struct drm_bridge **bridge) { - int ret = -EPROBE_DEFER; struct device_node *remote; if (!panel && !bridge) @@ -259,30 +287,74 @@ int drm_of_find_panel_or_bridge(const struct device_node *np, if (!remote) return -ENODEV; - if (panel) { - *panel = of_drm_find_panel(remote); - if (!IS_ERR(*panel)) - ret = 0; - else - *panel = NULL; - } + return of_drm_find_panel_or_bridge(remote, panel, bridge); +} +EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge); - /* No panel found yet, check for a bridge next. */ - if (bridge) { - if (ret) { - *bridge = of_drm_find_bridge(remote); - if (*bridge) - ret = 0; - } else { - *bridge = NULL; - } +/** + * drm_of_dsi_find_panel_or_bridge - return connected DSI panel or bridge device + * @np: device tree node containing encoder output ports + * @port: port in the device tree node + * @endpoint: endpoint in the device tree node + * @panel: pointer to hold returned drm_panel + * @bridge: pointer to hold returned drm_bridge + * + * Lookup for a child DSI node of the given parent that isn't either port + * or ports. If it is found then it will directly find the panel or bridge + * otherwise lookup for the child node with a given port and endpoint number + * as drm_of_find_panel_or_bridge does. + * + * Lookup a given child DSI node or a DT node's port and endpoint number, + * find the connected node and return either the associated struct drm_panel + * or drm_bridge device. Either @panel or @bridge must not be NULL. + * + * Returns zero if successful, or one of the standard error codes if it fails. + */ +int drm_of_dsi_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge) +{ + struct device_node *remote; + + if (!panel && !bridge) + return -EINVAL; + if (panel) + *panel = NULL; + /** + * Devices can also be child nodes when we also control that device + * through the upstream device (ie, MIPI-DCS for a MIPI-DSI device). + * + * Lookup for a child node of the given parent that isn't either port + * or ports. + */ + for_each_available_child_of_node(np, remote) { + if (of_node_name_eq(remote, "port") || + of_node_name_eq(remote, "ports")) + continue; + + goto of_find_panel_or_bridge; } - of_node_put(remote); - return ret; + /* + * of_graph_get_remote_node() produces a noisy error message if port + * node isn't found and the absence of the port is a legit case here, + * so at first we silently check whether graph presents in the + * device-tree node. + */ + if (!of_graph_is_present(np)) + return -ENODEV; + + remote = of_graph_get_remote_node(np, port, endpoint); + +of_find_panel_or_bridge: + if (!remote) + return -ENODEV; + + return of_drm_find_panel_or_bridge(remote, panel, bridge); } -EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge); +EXPORT_SYMBOL_GPL(drm_of_dsi_find_panel_or_bridge); enum drm_of_lvds_pixels { DRM_OF_LVDS_EVEN = BIT(0), diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h index 10ab58c40746..7a97157c1fa0 100644 --- a/include/drm/drm_of.h +++ b/include/drm/drm_of.h @@ -47,6 +47,10 @@ int drm_of_find_panel_or_bridge(const struct device_node *np, int port, int endpoint, struct drm_panel **panel, struct drm_bridge **bridge); +int drm_of_dsi_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge); int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, const struct device_node *port2); int drm_of_lvds_get_data_mapping(const struct device_node *port); @@ -99,6 +103,14 @@ static inline int drm_of_find_panel_or_bridge(const struct device_node *np, return -EINVAL; } +static inline int drm_of_dsi_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge) +{ + return -EINVAL; +} + static inline int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, const struct device_node *port2)