From patchwork Fri Aug 10 12:54:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Wiklander X-Patchwork-Id: 143918 Delivered-To: patches@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp3321069ljj; Fri, 10 Aug 2018 05:54:51 -0700 (PDT) X-Received: by 2002:a19:b519:: with SMTP id e25-v6mr4331279lff.119.1533905682231; Fri, 10 Aug 2018 05:54:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533905681; cv=none; d=google.com; s=arc-20160816; b=gjRd5SRp64lXYk54qSpKjCzHj2Tj9WJwe5qlYBDi6hz/X3YqHFXfTDEaRhvw4iLUnT HvEw/+8YEiCz8WHhleMTJcZ5OcNzqbd6+XXNYtyUVCTXXHIEzXRJm6EIQZsfQXOhlIcQ MogQvSr0fYaB7ZiTyZMC1pfNsFY3ylLYIKxe1aX2PK4hUSEhkiNF8SuFM9IzXyeM0WqK K3DH1mAGWNGWMHycQ7Lo75hEbf/vK1thLUsVGM1CCha9G9ZKUBuF/mARn2qxsbUxV0fR jooBGl6iTPtNBcEQ4X0r9Mwass73fmXC3LHQC//QhxcuocnQUVygHF2aRwv0JIz8chCK FlnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=WB0r/QnU5Maqf0pqVTMNOqHxmR20pieSek+3MYJad+w=; b=lPPMzw5gZbzyaAQbbJr0JUypSZfX6wl0CGJwBDqPPnP8+NvT2YF1OB9dx/YqskybaO pP2mS91PdGxslAogpuJLLbbmxwRfsE7LB3UiO/QkkH1XNvPW7fR3ECEEAWhWmlajbTP8 SABcqyndgUKG7CpsXl+nUU5FriDoyZUwygWVjsdyd+NagDmhxSDTwFvtOyh0najjMvgQ fzEPjloHq1JkeoeGkXr3re+fLT2mP/HrCJmTcTNNgal/vRGJXVlzxmSxgrauMAGR5Ys/ UaukAdBkjWb4HrS9eUvVZqKT8C5+SfCZYb1x/T4PmhaXbyc9uCUQuEIegl+E79U5Il4K nLyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="AMVhLG/I"; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id 126-v6sor1205550lfi.96.2018.08.10.05.54.41 for (Google Transport Security); Fri, 10 Aug 2018 05:54:41 -0700 (PDT) Received-SPF: pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="AMVhLG/I"; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WB0r/QnU5Maqf0pqVTMNOqHxmR20pieSek+3MYJad+w=; b=AMVhLG/IR2LUmJcPulFW5RksUFT988PBtjAZ2LYWbe6ujrI+N35YaX6k/CpJeTcpoY sl/m6saSGCHf3uiE9l3W5ya9uzu4dT46BEEf+rIphei4MhrGUMDVPhKgIHIjHpUIGamk PNNzM+YEK8ncb3r59q7kSHffE6ScR9TpTA7PE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WB0r/QnU5Maqf0pqVTMNOqHxmR20pieSek+3MYJad+w=; b=dotwRn5iJN7O0AP9zU8LS3OR4kOfueNGCQA4oayIDexxSIZ11eLIFHLZ7ZuQA5Eyoq 9PyQcRXMWtyLw4PcaN4415Y5UUl9ta961hjJSgaK0cnfvGse8ktblNi8EnCdBKlw02Wp lF577Utbl19K7cJpFvTtNgPX3DE5PwN3Dk9GIMSVUBEZYe3gJQA/i+ManLqJbB0aOVRI RHD7pC8B1/G6l3PIPquYbZ+BjmdN0o64dIykXndLkzbxLkEqWQyui+6gq5wDJ55zL0pl YmBIGgAiF3ZvhdraATwgDDbaOpvfAPENgW1HaFl9nTjqTR5Mx/zoEdMbBWugcS45udio j4IA== X-Gm-Message-State: AOUpUlFp0C0c2XMVu1XC2HQslU8LXVu1v4zpiR10zfV6WVJ6D04p1yum MzkFBBpuAmdrpln78fbjwUu02SXe X-Google-Smtp-Source: AA+uWPxw3xLQpWMCNnz+g4+pAktrAokJeyU7+pqoXj+UhnQnlVihw07gZaeCs/eVQbMOn+aDfaMvGw== X-Received: by 2002:a19:9e8c:: with SMTP id h134-v6mr4380520lfe.63.1533905680990; Fri, 10 Aug 2018 05:54:40 -0700 (PDT) Return-Path: Received: from jax.urgonet (h-84-105.A175.priv.bahnhof.se. [79.136.84.105]) by smtp.gmail.com with ESMTPSA id v10-v6sm1574518ljg.12.2018.08.10.05.54.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Aug 2018 05:54:40 -0700 (PDT) From: Jens Wiklander To: u-boot@lists.denx.de Cc: Simon Glass , Jens Wiklander Subject: [PATCH 1/2] ofnode: add ofnode_by_prop_value() Date: Fri, 10 Aug 2018 14:54:09 +0200 Message-Id: <20180810125410.19393-2-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180810125410.19393-1-jens.wiklander@linaro.org> References: <20180810125410.19393-1-jens.wiklander@linaro.org> Adds ofnode_by_prop_value() to search for nodes with a given property and value, an ofnode version of fdt_node_offset_by_prop_value(). Signed-off-by: Jens Wiklander --- drivers/core/of_access.c | 27 +++++++++++++++++++++++++++ drivers/core/ofnode.c | 14 ++++++++++++++ include/dm/of_access.h | 16 ++++++++++++++++ include/dm/ofnode.h | 14 ++++++++++++++ 4 files changed, 71 insertions(+) -- 2.17.1 diff --git a/drivers/core/of_access.c b/drivers/core/of_access.c index 0729dfcdb3b8..14c020a687b7 100644 --- a/drivers/core/of_access.c +++ b/drivers/core/of_access.c @@ -376,6 +376,33 @@ struct device_node *of_find_compatible_node(struct device_node *from, return np; } +static int of_device_has_prop_value(const struct device_node *device, + const char *propname, const void *propval, + int proplen) +{ + struct property *prop = of_find_property(device, propname, NULL); + + if (!prop || !prop->value || prop->length != proplen) + return 0; + return !memcmp(prop->value, propval, proplen); +} + +struct device_node *of_find_node_by_prop_value(struct device_node *from, + const char *propname, + const void *propval, int proplen) +{ + struct device_node *np; + + for_each_of_allnodes_from(from, np) { + if (of_device_has_prop_value(np, propname, propval, proplen) && + of_node_get(np)) + break; + } + of_node_put(from); + + return np; +} + struct device_node *of_find_node_by_phandle(phandle handle) { struct device_node *np; diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 0cfb0fbabb00..a7e192772324 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -777,3 +777,17 @@ ofnode ofnode_by_compatible(ofnode from, const char *compat) gd->fdt_blob, ofnode_to_offset(from), compat)); } } + +ofnode ofnode_by_prop_value(ofnode from, const char *propname, + const void *propval, int proplen) +{ + if (of_live_active()) { + return np_to_ofnode(of_find_node_by_prop_value( + (struct device_node *)ofnode_to_np(from), propname, + propval, proplen)); + } else { + return offset_to_ofnode(fdt_node_offset_by_prop_value( + gd->fdt_blob, ofnode_to_offset(from), + propname, propval, proplen)); + } +} diff --git a/include/dm/of_access.h b/include/dm/of_access.h index dd1abb8e97b4..5ed1a0cdb427 100644 --- a/include/dm/of_access.h +++ b/include/dm/of_access.h @@ -193,6 +193,22 @@ static inline struct device_node *of_find_node_by_path(const char *path) struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compatible); +/** + * of_find_node_by_prop_value() - find a node with a given property value + * + * Find a node based on a property value. + * @from: Node to start searching from or NULL. the node you pass will not be + * searched, only the next one will; typically, you pass what the previous + * call returned. + * @propname: property name to check + * @propval: property value to search for + * @proplen: length of the value in propval + * @return node pointer or NULL if not found + */ +struct device_node *of_find_node_by_prop_value(struct device_node *from, + const char *propname, + const void *propval, + int proplen); /** * of_find_node_by_phandle() - Find a node given a phandle * diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index ab36b74c4ca4..c06d77849c73 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -702,6 +702,20 @@ int ofnode_read_resource_byname(ofnode node, const char *name, */ ofnode ofnode_by_compatible(ofnode from, const char *compat); +/** + * ofnode_by_prop_value() - Find the next node with given property value + * + * Find the next node after @from that has a @propname with a value + * @propval and a length @proplen. + * + * @from: ofnode to start from (use ofnode_null() to start at the + * beginning) @propname: property name to check @propval: property value to + * search for @proplen: length of the value in propval @return ofnode + * found, or ofnode_null() if none + */ +ofnode ofnode_by_prop_value(ofnode from, const char *propname, + const void *propval, int proplen); + /** * ofnode_for_each_subnode() - iterate over all subnodes of a parent *