From patchwork Tue Jun 14 13:56:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Thomson X-Patchwork-Id: 9175869 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6D9876075D for ; Tue, 14 Jun 2016 13:56:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5DA06200E7 for ; Tue, 14 Jun 2016 13:56:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 51C772823D; Tue, 14 Jun 2016 13:56:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 43492200E7 for ; Tue, 14 Jun 2016 13:56:46 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 5088E266703; Tue, 14 Jun 2016 15:56:44 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id B600A261734; Tue, 14 Jun 2016 15:56:36 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 595662619D8; Tue, 14 Jun 2016 15:56:35 +0200 (CEST) Received: from mail1.bemta3.messagelabs.com (mail1.bemta3.messagelabs.com [195.245.230.166]) by alsa0.perex.cz (Postfix) with ESMTP id EAF45261615 for ; Tue, 14 Jun 2016 15:56:27 +0200 (CEST) Received: from [85.158.137.3] by server-6.bemta-3.messagelabs.com id 3D/56-24961-90D00675; Tue, 14 Jun 2016 13:56:25 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrAKsWRWlGSWpSXmKPExsUSt3OpsS4nb0K 4wb11qhZXLh5isuhtms5kMfXhEzaLndOuM1nMP3KO1WLmm/9sFs2L17NZdK3eyWKx8+FbNotv VzqYLJbv62e0uLxrDpvFx6UbWC2mbD/CbtG5q5/V4vGKt+wWKz9NYbFo3QsUW/1mAYvFhu9rG R1EPCZ+X8XuseFzE5vHzll32T0W73nJ5LFpVSebx7yTgR77565h99j3dhmbx/otV1k8Pm+SC+ CKYs3MS8qvSGDNmD+Vv+C9dsWf0xcYGxhvq3YxcnEICaxnlPh5/AR7FyMnkFMh8eboczYQm1c gU6J50VNGEJtTwF1iTUsrG0SNm8Tvi3vBbDYBC4nJJx6A2SwCqhI3ry1hBrGFBaIkHu7/zgqy QERgB4vEr8PP2UEcZoFWJom101ewQmwQlDg58wkLiM0sICFx8MULZogNBhKnFzSCxSUE7CWmv 78KFOcAsvUlGo/FQoQNJb7P+gZVYi7xe/E/lgmMgrOQTJ2FZOoCRqZVjBrFqUVlqUW6hsZ6SU WZ6RkluYmZObqGBsZ6uanFxYnpqTmJScV6yfm5mxiBMcsABDsYt233PMQoycGkJMq7lTkhXIg vKT+lMiOxOCO+qDQntfgQowwHh5IE7yVuoJxgUWp6akVaZg4wecCkJTh4lER4rXiA0rzFBYm5 xZnpEKlTjIpS4rxCIAkBkERGaR5cGyxhXWKUlRLmZQQ6RIinILUoN7MEVf4VozgHo5IwryPIF J7MvBK46a+AFjMBLbaZHg+yuCQRISXVwLhpk6i6Sb0Bh5baPIaKnWEbD21JvbVsfepZu71JCT ufSkhwCnwwPPprg2+n8cNc1XLPMluG548PG85zlY2etkmT0f3ym70b0k5ns+z3j9p26ubNN9G qHFzyZr+qJYzYp6g9rN21n7V9UrFHX7P21YNmlzjmMJVNcq390P3x+t5/FveLz8vocimxFGck GmoxFxUnAgCmeg13UwMAAA== X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-4.tower-38.messagelabs.com!1465912584!45572916!2 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 5541 invoked from network); 14 Jun 2016 13:56:25 -0000 Received: from mailrelay2.diasemi.com (HELO sw-ex-cashub01.diasemi.com) (94.185.165.51) by server-4.tower-38.messagelabs.com with AES128-SHA encrypted SMTP; 14 Jun 2016 13:56:25 -0000 Received: from swsrvapps-01.diasemi.com (10.20.28.141) by SW-EX-CASHUB01.diasemi.com (10.20.16.140) with Microsoft SMTP Server id 14.3.248.2; Tue, 14 Jun 2016 14:56:25 +0100 Received: by swsrvapps-01.diasemi.com (Postfix, from userid 22379) id 54DB73FB84; Tue, 14 Jun 2016 14:56:25 +0100 (BST) Message-ID: <866c9edccdd89805f6a0c0aa92f8a78ae616ed61.1465908072.git.Adam.Thomson.Opensource@diasemi.com> In-Reply-To: References: From: Adam Thomson Date: Tue, 14 Jun 2016 14:56:25 +0100 To: Robert Moore , Lv Zheng , Rafael J.Wysocki , Heikki Krogerus , Mika Westerberg , Len Brown , Andy Shevchenko , Rob Herring , Frank Rowand , Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Greg Kroah-Hartman MIME-Version: 1.0 X-KSE-AttachmentFiltering-Interceptor-Info: protection disabled X-KSE-ServerInfo: sw-ex-cashub01.diasemi.com, 9 X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 14/06/2016 11:13:00 Cc: devicetree@vger.kernel.org, alsa-devel@alsa-project.org, Support Opensource , linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, Sathyanarayana Nujella , devel@acpica.org Subject: [alsa-devel] [PATCH v3 1/2] device property: Add function to search for named child of device X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP For device nodes in both DT and ACPI, it possible to have named child nodes which contain properties (an existing example being gpio-leds). This adds a function to find a named child node for a device which can be used by drivers for property retrieval. For DT data node name matching, of_node_cmp() and similar functions are made available outside of CONFIG_OF block so the new function can reference these for DT and non-DT builds. For ACPI data node name matching, a helper function is also added which returns false if CONFIG_ACPI is not set, otherwise it performs a string comparison on the data node name. This avoids using the acpi_data_node struct for non CONFIG_ACPI builds, which would otherwise cause a build failure. Signed-off-by: Adam Thomson Tested-by: Sathyanarayana Nujella Acked-by: Rob Herring --- Changes in v3: - Move of_*_cmp() functions in of.h outside of CONFIG_OF block so they are available for non-DT builds - In device_get_named_child_node(), use of_node_cmp() helper macro instead of strcasecmp() (node names not alway case insensitive, depending on platform). Changes in v2: - Rebase to v4.7-rc1 drivers/base/property.c | 28 ++++++++++++++++++++++++++++ include/acpi/acpi_bus.h | 7 +++++++ include/linux/acpi.h | 6 ++++++ include/linux/of.h | 14 +++++++------- include/linux/property.h | 3 +++ 5 files changed, 51 insertions(+), 7 deletions(-) -- 1.9.3 diff --git a/drivers/base/property.c b/drivers/base/property.c index f38c21d..43a36d6 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -888,6 +888,34 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev, EXPORT_SYMBOL_GPL(device_get_next_child_node); /** + * device_get_named_child_node - Return first matching named child node handle + * @dev: Device to find the named child node for. + * @childname: String to match child node name against. + */ +struct fwnode_handle *device_get_named_child_node(struct device *dev, + const char *childname) +{ + struct fwnode_handle *child; + + /* + * Find first matching named child node of this device. + * For ACPI this will be a data only sub-node. + */ + device_for_each_child_node(dev, child) { + if (is_of_node(child)) { + if (!of_node_cmp(to_of_node(child)->name, childname)) + return child; + } else if (is_acpi_data_node(child)) { + if (acpi_data_node_match(child, childname)) + return child; + } + } + + return NULL; +} +EXPORT_SYMBOL_GPL(device_get_named_child_node); + +/** * fwnode_handle_put - Drop reference to a device node * @fwnode: Pointer to the device node to drop the reference to. * diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 788c6c3..993bdd0 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -420,6 +420,13 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn container_of(fwnode, struct acpi_data_node, fwnode) : NULL; } +static inline bool acpi_data_node_match(struct fwnode_handle *fwnode, + const char *name) +{ + return is_acpi_data_node(fwnode) ? + (!strcasecmp(to_acpi_data_node(fwnode)->name, name)) : false; +} + static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) { return &adev->fwnode; diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 288fac5..03039c4 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -568,6 +568,12 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn return NULL; } +static inline bool acpi_data_node_match(struct fwnode_handle *fwnode, + const char *name) +{ + return false; +} + static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) { return NULL; diff --git a/include/linux/of.h b/include/linux/of.h index 74eb28c..310e32f 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -238,13 +238,6 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size) #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 #endif -/* Default string compare functions, Allow arch asm/prom.h to override */ -#if !defined(of_compat_cmp) -#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2)) -#define of_prop_cmp(s1, s2) strcmp((s1), (s2)) -#define of_node_cmp(s1, s2) strcasecmp((s1), (s2)) -#endif - #define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags) #define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags) @@ -726,6 +719,13 @@ static inline void of_property_clear_flag(struct property *p, unsigned long flag #define of_match_node(_matches, _node) NULL #endif /* CONFIG_OF */ +/* Default string compare functions, Allow arch asm/prom.h to override */ +#if !defined(of_compat_cmp) +#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2)) +#define of_prop_cmp(s1, s2) strcmp((s1), (s2)) +#define of_node_cmp(s1, s2) strcasecmp((s1), (s2)) +#endif + #if defined(CONFIG_OF) && defined(CONFIG_NUMA) extern int of_node_to_nid(struct device_node *np); #else diff --git a/include/linux/property.h b/include/linux/property.h index ecab11e..3a2f9ae 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -77,6 +77,9 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev, for (child = device_get_next_child_node(dev, NULL); child; \ child = device_get_next_child_node(dev, child)) +struct fwnode_handle *device_get_named_child_node(struct device *dev, + const char *childname); + void fwnode_handle_put(struct fwnode_handle *fwnode); unsigned int device_get_child_node_count(struct device *dev);