From patchwork Tue Jun 21 17:50:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Thomson X-Patchwork-Id: 9191425 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 C11306075E for ; Tue, 21 Jun 2016 21:29:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B10882833A for ; Tue, 21 Jun 2016 21:29:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A5AC528358; Tue, 21 Jun 2016 21:29:53 +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 A91652833A for ; Tue, 21 Jun 2016 21:29:52 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id B5257266B46; Tue, 21 Jun 2016 23:29:51 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 7B4C4266C6F; Tue, 21 Jun 2016 20:31:37 +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 7FFC8267BE0; Tue, 21 Jun 2016 20:31:35 +0200 (CEST) Received: from mail1.bemta14.messagelabs.com (mail1.bemta14.messagelabs.com [193.109.254.117]) by alsa0.perex.cz (Postfix) with ESMTP id C18E1266C6C for ; Tue, 21 Jun 2016 19:50:22 +0200 (CEST) Received: from [85.158.140.195] by server-13.bemta-14.messagelabs.com id 7B/A6-09524-E5E79675; Tue, 21 Jun 2016 17:50:22 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprOKsWRWlGSWpSXmKPExsUSt3OpsW5sXWa 4weLruhZXLh5isuhtms5kMfXhEzaL+UfOsVrMfPOfzaJr9U4Wi50P37JZfLvSwWSxfF8/o8Xl XXPYLD4u3cBqMWX7EXaLxyveslus/DSFxaJ1L5C7+s0CFgcBjw2fm9g8ds66y+6xeM9LJo9Nq zrZPOadDPT4vEkugC2KNTMvKb8igTXj/N0VzAVrdSvmrH7B1sD4Q62LkYtDSGA9o8Sc1cuZuh g5gZwKiaUN2xhBbF6BTInn99eydjFycHAKuEt8X5kOUeImcXfhfDYQm03AQmLyiQdsICUsAqo S147Lg4SFBaIk3jx9ywQyXkTgCLPE+uPdzCAOs8B8JomNT2ayQMwXlDg58wmYzSwgIXHwxQtm iAUGEqcXNILFJQTsJaa/v8oMskBCQF+i8VgsRNhQ4vusb1Al5hI/Pj5insAoOAvJ1FlIpi5gZ FrFqFGcWlSWWqRraK6XVJSZnlGSm5iZo2toaKKXm1pcnJiempOYVKyXnJ+7iREYYfUMDIw7GH +e9jzEKMnBpCTKy6ycES7El5SfUpmRWJwRX1Sak1p8iFGGg0NJgvdvdWa4kGBRanpqRVpmDjD WYdISHDxKIrwFNUBp3uKCxNzizHSI1ClGRSlxXnuQhABIIqM0D64Nll4uMcpKCfMyMjAwCPEU pBblZpagyr9iFOdgVBLmLQGZwpOZVwI3/RXQYiagxcv600EWlyQipKQaGLfdTQh8bsSkbKXhF ee2ysdKdu+xx1xb+hJXmT1xPyhtW5jxaeYio4Tn5cUzlzG9sPAvSF1hEp72sft3vcrO4M7nFd MjP8gUBbwUYKzarxVZ9oxXw77x/Az3xQIL79hNfT3feGaXdtVkjTmap6MyjVkZf/6asHbdkue u5oJ35z79fP+NiRLfcyWW4oxEQy3mouJEAN6vOyIqAwAA X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-15.tower-193.messagelabs.com!1466531421!43264892!2 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 25719 invoked from network); 21 Jun 2016 17:50:21 -0000 Received: from mailrelay2.diasemi.com (HELO sw-ex-cashub01.diasemi.com) (94.185.165.51) by server-15.tower-193.messagelabs.com with AES128-SHA encrypted SMTP; 21 Jun 2016 17:50:21 -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, 21 Jun 2016 18:50:21 +0100 Received: by swsrvapps-01.diasemi.com (Postfix, from userid 22379) id E3BCA3FAEB; Tue, 21 Jun 2016 18:50:20 +0100 (BST) Message-ID: In-Reply-To: References: From: Adam Thomson Date: Tue, 21 Jun 2016 18:50:20 +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 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: 21/06/2016 12:13:00 Cc: devicetree , alsa-devel , Support Opensource , linux-kernel , linux-acpi , Sathyanarayana Nujella Subject: [alsa-devel] [PATCH v4 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 Acked-by: Sathyanarayana Nujella Acked-by: Rob Herring --- Changes in v4: - Rebase to v4.7-rc4 - Use strcmp() in acpi_data_node_match() for matching ACPI data node strings, as expected by ACPI specification. 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..c1a524d 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) ? + (!strcmp(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);