From patchwork Mon Jun 20 11:38:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Thomson X-Patchwork-Id: 9187269 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 E7BCD6075F for ; Mon, 20 Jun 2016 11:39:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CEEBF1FFC9 for ; Mon, 20 Jun 2016 11:39:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C117A2684F; Mon, 20 Jun 2016 11:39:25 +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 E685E1FFC9 for ; Mon, 20 Jun 2016 11:39:23 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id E04982665A6; Mon, 20 Jun 2016 13:39:22 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 3DAEB265289; Mon, 20 Jun 2016 13:39:15 +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 843C5265289; Mon, 20 Jun 2016 13:39:13 +0200 (CEST) Received: from mail1.bemta5.messagelabs.com (mail1.bemta5.messagelabs.com [195.245.231.141]) by alsa0.perex.cz (Postfix) with ESMTP id 92692265779 for ; Mon, 20 Jun 2016 13:39:00 +0200 (CEST) Received: from [85.158.139.51] by server-5.bemta-5.messagelabs.com id 9A/C8-29837-3D5D7675; Mon, 20 Jun 2016 11:38:59 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrKKsWRWlGSWpSXmKPExsUSt3Opse7lq+n hBgfahCyuXDzEZNHbNJ3JYurDJ2wW84+cY7WY+eY/m0Xz4vVsFl2rd7JY7Hz4ls3i25UOJovl +/oZLS7vmsNm8XHpBlaLKduPsFt07upntXi84i27xcpPU1gsWvcCxVa/WcBiseH7WkYHYY8Nn 5vYPHbOusvusXjPSyaPTas62TzmnQz02D93DbvHvrfL2DzWb7nK4vF5k1wAZxRrZl5SfkUCa8 a/N8fYC6brVFzft5i1gfG/ahcjF4eQwHpGiXuPjjF1MXICORUSVzr+MILYvAKZEpc2XmXrYuT g4BRwl5h2UhTEFBJwk7hwXRekgk3AQmLyiQdsIDaLgKrEtVlrWEBsYYFEiTNL5jKBjBcR2MEi 8evwc3YQh1ngA6PEob9PWCDmC0qcnAlhMwtISBx88YIZ4gYDidMLGsHiEgL2EtPfX2UGWSwho C/ReCwWImwo8X3WN6gSc4kLS9YwTWAUnIVk6iwkUxcwMq1i1ChOLSpLLdI1MtZLKspMzyjJTc zM0TU0MNXLTS0uTkxPzUlMKtZLzs/dxAiMznoGBsYdjDva/Q4xSnIwKYny2hSnhwvxJeWnVGY kFmfEF5XmpBYfYpTh4FCS4L1/GSgnWJSanlqRlpkDTBMwaQkOHiUR3ukgad7igsTc4sx0iNQp RkUpcd5bIAkBkERGaR5cGyw1XWKUlRLmZWRgYBDiKUgtys0sQZV/xSjOwagkzPsEZApPZl4J3 PRXQIuZgBYv6wdbXJKIkJJqYKzqvBR31HjpqzT1FztPzJjJFchzrHhm9npfkaL69Vuqbra+/L r211qdmW6W+e/bFqoFBWjVCNTujVNr3PCc+azbBvYrkdduMn9e3BvPY/rN1nb21msZan5ua5+ GVS4xSOuu0fLTOWDl+vjK3ID08BdrL4k8O3i472X4fcs9nWuXtNxoUtZtdFRiKc5INNRiLipO BABqFipRSAMAAA== X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-8.tower-180.messagelabs.com!1466422739!41296629!1 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 25856 invoked from network); 20 Jun 2016 11:38:59 -0000 Received: from mailrelay2.diasemi.com (HELO sw-ex-cashub01.diasemi.com) (94.185.165.51) by server-8.tower-180.messagelabs.com with AES128-SHA encrypted SMTP; 20 Jun 2016 11:38:59 -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; Mon, 20 Jun 2016 12:38:59 +0100 Received: by swsrvapps-01.diasemi.com (Postfix, from userid 22379) id BEA0C3FBAB; Mon, 20 Jun 2016 12:38:58 +0100 (BST) Message-ID: <866c9edccdd89805f6a0c0aa92f8a78ae616ed61.1466421714.git.Adam.Thomson.Opensource@diasemi.com> In-Reply-To: References: From: Adam Thomson Date: Mon, 20 Jun 2016 12:38:58 +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: 20/06/2016 09:17: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 Subject: [alsa-devel] [RESEND 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);