Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp328316ybt; Tue, 30 Jun 2020 22:46:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz8RUckGQZVyIWleUL/AcPh8xE3VY5KC+FRAFvYdMsfOuHnVZYFXYRNKqohnIQZJMrsqp4C X-Received: by 2002:a05:6402:6c4:: with SMTP id n4mr28056352edy.353.1593582384016; Tue, 30 Jun 2020 22:46:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593582384; cv=none; d=google.com; s=arc-20160816; b=YQRmEPqIgAmUnPYqXNdxfLpOnnrVrCTLcryaIX3hjXK7eyx7YTrBF7W0Q8bbm2wzvF uQ/c04QgH5vUlXpDU8UGMk1ot6zxwUZ08OelArLzD1BRY2mTpU4tLK84bVNMLbFZ8HMI GRB3VulOmVgpPmfd4IVzdHAdsZ+ok8SlUhHSSRjMuXvkF9Vly8H29WlQJTlyi+dg3CQT maHNC0ZaMDqJdFjwv+VP/1wswykTSxfYP8rTIU9HljjlrV5M0ySEEDoTVArq9aLyz6q4 yVgvqPVGYRk1pq8MsNlrM3uscgHjACkiglGfGVOKpthgBHlXPuAlkKYkekfjp/xz+/fD vAyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=ueWvLHFL8vmxyriLiqRc85fkWNiC6ypSqjpVvNf1acA=; b=vZGsQgiOCzsw/s384vVPmow2ZnMm/S+kgIgrIQPlp2XMHJ5xVGCUIi8cp4AwdM1m3T qxdPGaCqOPQAv9bM0sxR/x14Tkm+qqwZ22f/26AfR6p+xShkFDDtNESXv9G/Hfsimnb9 K+eBEAmu80pOLaiF7jMdpfoh5WmdFsd4CTMsGB70ctjUv7d0IkzuNOt+eTJ7yz5sNhyk 6l3jz/YIxv82MhjDkbufo4mqnA8+iMOP6MrP4anPI0QD3w6GgvbmFYFc3saUSg40mxuZ VqbAnlANxrxczv3sz3IwiMOxoSOSipm0bKzyqyOV6LxayfxEqQUqe01LwweXcd4CsUKe 80GA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=X+IRvj1J; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id be27si3308026edb.50.2020.06.30.22.46.00; Tue, 30 Jun 2020 22:46:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=X+IRvj1J; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726803AbgGAFpx (ORCPT + 99 others); Wed, 1 Jul 2020 01:45:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725272AbgGAFpw (ORCPT ); Wed, 1 Jul 2020 01:45:52 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A422AC03E979; Tue, 30 Jun 2020 22:45:51 -0700 (PDT) Received: from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 686F4556; Wed, 1 Jul 2020 07:45:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1593582347; bh=mGWu/1XJbM4KGrtlPmkgFMmfJiW0pibp/qTE2B02jfg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=X+IRvj1JQdnrCzqeSPqQAnKWc5n8pBOvwmPEoRCo5kDbAhlzI3O/ybiM5Np6j7AcY dgzuPrtz48/lWFwu1e2QbuxWjOqaKlvmXg5/9wFfT6mRXC62oAxi/4sUBPKdgntwbW lBNa3k/xfcURd85HCkcaeh3ovjlEG2f4hwBIP6lA= Date: Wed, 1 Jul 2020 08:45:43 +0300 From: Laurent Pinchart To: Dmitry Osipenko Cc: Thierry Reding , Sam Ravnborg , Rob Herring , Frank Rowand , dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v9 1/2] of_graph: add of_graph_is_present() Message-ID: <20200701054543.GA5963@pendragon.ideasonboard.com> References: <20200701021617.12030-1-digetx@gmail.com> <20200701021617.12030-2-digetx@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20200701021617.12030-2-digetx@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Dmitry, Thank you for the patch. On Wed, Jul 01, 2020 at 05:16:16AM +0300, Dmitry Osipenko wrote: > In some case, like a DRM display code for example, it's useful to silently > check whether port node exists at all in a device-tree before proceeding > with parsing of the graph. > > This patch adds of_graph_is_present() which returns true if given > device-tree node contains OF graph port. > > Reviewed-by: Rob Herring > Signed-off-by: Dmitry Osipenko > --- > drivers/of/property.c | 52 +++++++++++++++++++++++++++++++++------- > include/linux/of_graph.h | 6 +++++ > 2 files changed, 49 insertions(+), 9 deletions(-) > > diff --git a/drivers/of/property.c b/drivers/of/property.c > index 6a5760f0d6cd..e12b8b491837 100644 > --- a/drivers/of/property.c > +++ b/drivers/of/property.c > @@ -29,6 +29,48 @@ > > #include "of_private.h" > > +/** > + * of_graph_get_first_local_port() - get first local port node > + * @node: pointer to a local endpoint device_node It's not an endpoint. > + * > + * Return: First local port node associated with local endpoint node linked > + * to @node. Use of_node_put() on it when done. > + */ > +static struct device_node * > +of_graph_get_first_local_port(const struct device_node *node) > +{ > + struct device_node *ports, *port; > + > + ports = of_get_child_by_name(node, "ports"); > + if (ports) > + node = ports; > + > + port = of_get_child_by_name(node, "port"); > + of_node_put(ports); > + > + return port; > +} > + > +/** > + * of_graph_is_present() - check graph's presence > + * @node: pointer to a device_node checked for the graph's presence > + * > + * Return: True if @node has a port or ports sub-node, false otherwise. > + */ > +bool of_graph_is_present(const struct device_node *node) > +{ > + struct device_node *local; > + > + local = of_graph_get_first_local_port(node); > + if (!local) > + return false; > + > + of_node_put(local); > + > + return true; > +} > +EXPORT_SYMBOL(of_graph_is_present); > + > /** > * of_property_count_elems_of_size - Count the number of elements in a property > * > @@ -608,15 +650,7 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, > * parent port node. > */ > if (!prev) { > - struct device_node *node; > - > - node = of_get_child_by_name(parent, "ports"); > - if (node) > - parent = node; > - > - port = of_get_child_by_name(parent, "port"); > - of_node_put(node); > - > + port = of_graph_get_first_local_port(parent); I think this introduces a bug below in the function, where parent is used and is expected to point to the ports node if available. I'd leave this part of the change out, and inline +of_graph_get_first_local_port() in of_graph_is_present(). > if (!port) { > pr_err("graph: no port node found in %pOF\n", parent); > return NULL; > diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h > index 01038a6aade0..4d7756087b6b 100644 > --- a/include/linux/of_graph.h > +++ b/include/linux/of_graph.h > @@ -38,6 +38,7 @@ struct of_endpoint { > child = of_graph_get_next_endpoint(parent, child)) > > #ifdef CONFIG_OF > +bool of_graph_is_present(const struct device_node *node); > int of_graph_parse_endpoint(const struct device_node *node, > struct of_endpoint *endpoint); > int of_graph_get_endpoint_count(const struct device_node *np); > @@ -56,6 +57,11 @@ struct device_node *of_graph_get_remote_node(const struct device_node *node, > u32 port, u32 endpoint); > #else > > +static inline bool of_graph_is_present(const struct device_node *node) > +{ > + return false; > +} > + > static inline int of_graph_parse_endpoint(const struct device_node *node, > struct of_endpoint *endpoint) > { -- Regards, Laurent Pinchart