All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-acpi@vger.kernel.org
Cc: andriy.shevchenko@linux.intel.com,
	heikki.krogerus@linux.intel.com, rafael@kernel.org,
	/tmp/small/0000-cover-letter.patch@punajuuri.localdomain
Subject: [PATCH 5/7] device property: Implement fwnode_graph_get_endpoint_count()
Date: Tue, 30 Nov 2021 17:32:48 +0200	[thread overview]
Message-ID: <20211130153250.935726-5-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20211130153250.935726-1-sakari.ailus@linux.intel.com>

Add fwnode_graph_get_endpoint_count() function to provide generic
implementation of of_graph_get_endpoint_count(). The former by default
only counts endpoints to available devices which is consistent with the
rest of the fwnode graph API. By providing FWNODE_GRAPH_DEVICE_DISABLED
flag, also unconnected endpoints and endpoints to disabled devices are
counted.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/base/property.c  | 51 ++++++++++++++++++++++++++++++++--------
 include/linux/property.h |  2 ++
 2 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/drivers/base/property.c b/drivers/base/property.c
index ecc4e2eb10678..248034553005f 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -1097,6 +1097,18 @@ fwnode_graph_get_remote_node(const struct fwnode_handle *fwnode, u32 port_id,
 }
 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node);
 
+static bool fwnode_graph_remote_available(struct fwnode_handle *ep)
+{
+	struct fwnode_handle *dev_node;
+	bool available;
+
+	dev_node = fwnode_graph_get_remote_port_parent(ep);
+	available = fwnode_device_is_available(dev_node);
+	fwnode_handle_put(dev_node);
+
+	return available;
+}
+
 /**
  * fwnode_graph_get_endpoint_by_id - get endpoint by port and endpoint numbers
  * @fwnode: parent fwnode_handle containing the graph
@@ -1130,16 +1142,8 @@ fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
 		struct fwnode_endpoint fwnode_ep = { 0 };
 		int ret;
 
-		if (enabled_only) {
-			struct fwnode_handle *dev_node;
-			bool available;
-
-			dev_node = fwnode_graph_get_remote_port_parent(ep);
-			available = fwnode_device_is_available(dev_node);
-			fwnode_handle_put(dev_node);
-			if (!available)
-				continue;
-		}
+		if (enabled_only && !fwnode_graph_remote_available(ep))
+			continue;
 
 		ret = fwnode_graph_parse_endpoint(ep, &fwnode_ep);
 		if (ret < 0)
@@ -1172,6 +1176,33 @@ fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
 }
 EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_by_id);
 
+/**
+ * fwnode_graph_get_endpoint_count - Count endpoints on a device node
+ * @fwnode: The node related to a device
+ * @flags: fwnode lookup flags
+ * Count endpoints in a device node.
+ *
+ * If FWNODE_GRAPH_DEVICE_DISABLED flag is specified, also unconnected endpoints
+ * and endpoints connected to disabled devices are counted.
+ */
+unsigned int fwnode_graph_get_endpoint_count(struct fwnode_handle *fwnode,
+					     unsigned long flags)
+{
+	struct fwnode_handle *ep;
+	unsigned int count = 0;
+
+	fwnode_graph_for_each_endpoint(fwnode, ep) {
+		if (!(flags & FWNODE_GRAPH_DEVICE_DISABLED) &&
+		    !fwnode_graph_remote_available(ep))
+			continue;
+
+		count++;
+	}
+
+	return count;
+}
+EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_count);
+
 /**
  * fwnode_graph_parse_endpoint - parse common endpoint node properties
  * @fwnode: pointer to endpoint fwnode_handle
diff --git a/include/linux/property.h b/include/linux/property.h
index af5a7e512c86f..e32b95f42c9db 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -427,6 +427,8 @@ static inline bool fwnode_graph_is_endpoint(struct fwnode_handle *fwnode)
 struct fwnode_handle *
 fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
 				u32 port, u32 endpoint, unsigned long flags);
+unsigned int fwnode_graph_get_endpoint_count(struct fwnode_handle *fwnode,
+					     unsigned long flags);
 
 #define fwnode_graph_for_each_endpoint(fwnode, child)			\
 	for (child = NULL;						\
-- 
2.30.2


  parent reply	other threads:[~2021-11-30 15:32 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-30 15:32 [PATCH 1/7] device property: Fix fwnode_graph_devcon_match() fwnode leak Sakari Ailus
2021-11-30 15:32 ` [PATCH 2/7] device property: Fix documentation for FWNODE_GRAPH_DEVICE_DISABLED Sakari Ailus
2021-11-30 15:32 ` [PATCH 3/7] Documentation: ACPI: Fix data node reference documentation Sakari Ailus
2021-11-30 15:55   ` Andy Shevchenko
2021-11-30 20:42     ` Sakari Ailus
2021-11-30 20:50       ` Rafael J. Wysocki
2021-11-30 15:32 ` [PATCH 4/7] Documentation: ACPI: Update references Sakari Ailus
2021-11-30 15:57   ` Andy Shevchenko
2021-11-30 15:32 ` Sakari Ailus [this message]
2021-11-30 16:01   ` [PATCH 5/7] device property: Implement fwnode_graph_get_endpoint_count() Andy Shevchenko
2021-11-30 15:32 ` [PATCH 6/7] device property: Use fwnode_graph_for_each_endpoint() macro Sakari Ailus
2021-11-30 15:32 ` [PATCH 7/7] device property: Drop fwnode_graph_get_remote_node() Sakari Ailus
2021-11-30 16:05   ` Andy Shevchenko
2021-11-30 20:40     ` Sakari Ailus
2021-11-30 16:07 ` [PATCH 1/7] device property: Fix fwnode_graph_devcon_match() fwnode leak Andy Shevchenko
2021-11-30 20:21   ` Sakari Ailus
2021-12-01 13:19   ` Sakari Ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211130153250.935726-5-sakari.ailus@linux.intel.com \
    --to=sakari.ailus@linux.intel.com \
    --cc=/tmp/small/0000-cover-letter.patch@punajuuri.localdomain \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=rafael@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.